~e93b5ae3/4digits/master

« back to all changes in this revision

Viewing changes to 4digits

  • Committer: Yongzhi Pan
  • Date: 2018-01-07 09:56:08 UTC
  • Revision ID: git-v1:ffc2e3fe55ca73335e12b0ded42a52d21e555e9e
Use GTK+ via PyGobject.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#! /usr/bin/env python
 
1
#! /usr/bin/env python2
2
2
# -*- coding: utf-8 -*-
3
3
"""
4
4
    4digits - A guess-the-number game, aka Bulls and Cows
41
41
# LOCALE_PATH = '/usr/share/locale/'
42
42
LOCALE_PATH = 'locale/'
43
43
 
44
 
import pygtk
45
 
 
46
 
pygtk.require('2.0')
47
 
# These can only be found after pygtk is "required" on OS X if pygtk is
48
 
# installed via Homebrew.
49
 
import gtk
50
 
#import gtk.glade
51
 
import pango
 
44
import gi
 
45
gi.require_version('Gtk', '3.0')
 
46
from gi.repository import Gtk, Pango
52
47
 
53
48
gladefiles = [os.path.join(os.path.dirname(__file__), '4digits.glade'),
54
49
              "/usr/share/4digits/4digits.glade"]  # For debian packages.
71
66
 
72
67
    def __init__(self):
73
68
        """GUI initialization."""
74
 
        self.widget_tree = gtk.Builder()
 
69
        self.widget_tree = Gtk.Builder()
75
70
        self.widget_tree.set_translation_domain('4digits')
76
71
        for gladefile in gladefiles:
77
72
            try:
94
89
        self.entry = self.widget_tree.get_object('entry')
95
90
        self.entry.grab_focus()
96
91
        fontsize = self.entry.get_pango_context(). \
97
 
                       get_font_description().get_size() / pango.SCALE
98
 
        self.entry.modify_font(pango.FontDescription(str(int(fontsize * 3))))
 
92
                       get_font_description().get_size() / Pango.SCALE
 
93
        self.entry.modify_font(Pango.FontDescription(str(int(fontsize * 3))))
99
94
 
100
95
        self.ok_button = self.widget_tree.get_object('ok_button')
101
96
        for widget in ('g0', 'g1', 'g2', 'g3', 'g4', 'g5', 'g6', 'g7',
113
108
        self.about_dialog = self.widget_tree.get_object('about_dialog')
114
109
        self.score_dialog = self.widget_tree.get_object('score_dialog')
115
110
 
116
 
        # gtk.Dialog use gtk.show_uri to open URL, which depends on gvfs,
117
 
        # which is not available on OS X. Use webbrowser.open instead.
118
 
        # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=519159
119
 
        # http://stackoverflow.com/q/25752808/547578
120
 
        def uri_hook_func(dialog, link, user_data):
121
 
            webbrowser.open(link, new=2)
122
 
        gtk.about_dialog_set_url_hook(uri_hook_func, data=None)
123
 
 
124
111
        # parse preferences
125
112
        self.read_prefs()
126
113
        if prefs['show toolbar']:
134
121
            self.hint_hseparator.show()
135
122
            self.view_hint_table.set_active(True)
136
123
        else:
137
 
            self.hint_table.hide_all()
 
124
            self.hint_table.hide()
138
125
            self.hint_hseparator.hide()
139
126
            self.view_hint_table.set_active(False)
140
127
        if prefs['auto fill hints']:
184
171
        """Create the controls for the hint table."""
185
172
        hint_table = self.widget_tree.get_object('hint_table')
186
173
        for name in (0, 40):
187
 
            table = gtk.Table(rows=11, columns=6)
188
 
            hint_table.pack_start(table)
 
174
            table = Gtk.Table(rows=11, columns=6)
 
175
            hint_table.pack_start(table, True, True, 0)
189
176
 
190
177
            # Create row labels
191
178
            for row in range(10):
192
 
                label = gtk.CheckButton(str(row))
 
179
                label = Gtk.CheckButton(str(row))
193
180
                table.attach(label, 0, 1, row + 1, row + 2)
194
181
                label.connect('toggled', self.change_row, row + name)
195
182
                self.label_hint.append(label)
200
187
                #table.attach(label, col, col+1, 0, 1)
201
188
                # Create Checkboxes
202
189
                for row in range(10):
203
 
                    checkbutton = gtk.CheckButton()
 
190
                    checkbutton = Gtk.CheckButton()
204
191
                    table.attach(checkbutton, col, col + 1, row + 1, row + 2)
205
192
                    self.cb_hint.append(checkbutton)
206
193
 
207
194
            if name == 0:  # First table
208
 
                hint_table.pack_start(gtk.VSeparator())
 
195
                hint_table.pack_start(Gtk.VSeparator(), True, True, 0)
209
196
        self.init_hint_table()
210
197
 
211
198
    def change_row(self, widget, row):
369
356
    def on_view_hint_table_toggled(self, widget):
370
357
        """Toggle hint table visibility."""
371
358
        if self.hint_table.get_property('visible'):
372
 
            self.hint_table.hide_all()
 
359
            self.hint_table.hide()
373
360
            self.hint_hseparator.hide()
374
361
            prefs['show hint table'] = False
375
362
        else:
405
392
    def on_score_activate(self, new_score_rank):
406
393
        """Show high scores."""
407
394
        sv_selection = self.score_view.get_selection()
408
 
        sv_selection.set_mode(gtk.SELECTION_NONE)
 
395
        sv_selection.set_mode(Gtk.SelectionMode.NONE)
409
396
 
410
397
        # Since we hide but don't destory the score dialog, we have to remove
411
398
        # all columns before appending, otherwise we would have more and more
415
402
        # FIXME: column header not translated under windows
416
403
        columns = [_('Name'), _('Score'), _('Date')]
417
404
        for p in enumerate(columns):
418
 
            column = gtk.TreeViewColumn(p[1], gtk.CellRendererText(),
 
405
            column = Gtk.TreeViewColumn(p[1], Gtk.CellRendererText(),
419
406
                                        text=p[0])
420
407
            self.score_view.append_column(column)
421
408
 
422
 
        scoreList = gtk.ListStore(str, str, str)
 
409
        scoreList = Gtk.ListStore(str, str, str)
423
410
        self.score_view.set_model(scoreList)
424
411
 
425
412
        try:
433
420
            scoreList.append(score_tup)
434
421
        # high light the current high score entry
435
422
        try:
436
 
            sv_selection.set_mode(gtk.SELECTION_SINGLE)
 
423
            sv_selection.set_mode(Gtk.SelectionMode.SINGLE)
437
424
            sv_selection.select_path(new_score_rank)
438
425
        except TypeError:
439
 
            sv_selection.set_mode(gtk.SELECTION_NONE)
 
426
            sv_selection.set_mode(Gtk.SelectionMode.NONE)
440
427
 
441
428
        self.score_dialog.run()
442
429
        self.score_dialog.hide()
569
556
        Copied from comix.
570
557
        """
571
558
        self.save_prefs()
572
 
        gtk.main_quit()
 
559
        Gtk.main_quit()
573
560
 
574
561
 
575
562
class NewRound:
582
569
                break
583
570
        #print self.answer
584
571
        if self.answer == [4, 6, 1, 9]:
585
 
            gtk.MessageDialog(message_format=_(
 
572
            Gtk.MessageDialog(message_format=_(
586
573
                '4619: You are the luckiest guy on the planet!')).show()
587
574
        self.guess = 0
588
575
        self.guesses = []
612
599
    #gtk.glade.textdomain(APP)
613
600
 
614
601
    MainWindow()
615
 
    gtk.main()
 
602
    Gtk.main()