Форум сайта python.su
Начал изучать Python, добрался до PyGTK, и тут есть вопросы, по которым некуда больше обратиться. Прошу о помощи.
Программа предполагает изучение топ-1000 английских слов. Запускаешь, она выдает слово и 4 варианта ответа на кнопках. Пока просто делаю. Жмешь кнопку, она проверяет. Правильно - чекает слово, идем дальше, загружаем новое слово и результаты. Извещаем пользователя пока в консоли (на лейбл вывести не проблема - это потом сделаю). Неверно - извещает и грузит другое слово. Как грамотно перерисовывать окно - я пока не вполне понимаю. Пробовал в цикле это делать. Получается косяк - при правильном ответе открывается новое окно, старое же никуда не девается.
При неверном только извещение в консоли - вариант остается старый в окне.
Прошу подсказать, как заставить окно перерисовываться или закрываться в нужном месте.
В консоли у меня программа отрабатывала, как надо. Подозреваю, что проблема кроется в def check, но сам никак косяк не нащупаю.
Ниже код прилагается. Так же во вложении база и окно глейда. Извиняюсь за плохой код - я только учусь.
Безмерно благодарен буду за помощь.
#!/usr/bin/python3 from gi.repository import Gtk import random import os dt = [] with open('freq.dict', encoding='utf-8') as dt: dt = dt.read().splitlines() l = len(dt) # Кол-во строк в словаре x = 0 while x < int(l): # тут заполняем массив списком с числами L = [] for j in range(int(l)): L.append(x) x += 1 #Создаем вложенный список dic = [] for i in L: dic.append(dt[i].split("-")) # Разделяем части строки по дефису # Функция замены строки (нужна вся строка!) def ReplaceLineInFile(fileName, sourceText, replaceText): file = open(fileName, 'r') text = file.read() file.close() file = open(fileName, 'w') file.write(text.replace(sourceText, replaceText)) file.close() def check (word): ans = stack[int(word)-1][2] global ret if ans == ch[2]: print ("good))") # tr = ch[0] + "-" + ch[1] + "-" + ch[2] # Верно угаданная строка # ReplaceLineInFile ('freq.dict', tr, tr + ' - X') # os.system('clear') # continue ret = 0 else: print ("Wrong." + ch[1] + "-" + ch[2]) # con = input ('Do you want to repeat? (y/n)') # print ("") # if con == 'n' or 'N' or 'no' or 'No' or 'NO': # break ret = 1 ##################################### class okno: def on_window1_destroy(self, object, data=None): print ("quit with cancel") Gtk.main_quit() def on_clicked(self, widget): Gtk.main_quit() def on_button1_clicked(self, button, data=None): self.label1 = self.builder.get_object("label1") reply = 1 check (reply) if ret == 0: print ('!!!') Gtk.main_quit() def on_button2_clicked(self, button, data=None): self.label1 = self.builder.get_object("label1") reply = 2 check (reply) if ret == 0: print ('!!!') Gtk.main_quit() def on_button3_clicked(self, button, data=None): self.label1 = self.builder.get_object("label1") reply = 3 check (reply) if ret == 0: print ('!!!') Gtk.main_quit() def on_button4_clicked(self, button, data=None): self.label1 = self.builder.get_object("label1") reply = 4 check (reply) if ret == 0: print ('!!!') Gtk.main_quit() def update(self, widget, data=None): print ("Update") self.remove_window(self.window) reload(builder) self.window = self.builder.get_object("window1") self.window.show() def __init__(self): self.gladefile = "try-1.glade" self.builder = Gtk.Builder() self.builder.add_from_file(self.gladefile) self.builder.connect_signals(self) self.window = self.builder.get_object("window1") self.button1 = self.builder.get_object("button1") self.button1.set_label(str(rand1[2])) self.button1.connect("clicked", self.on_clicked) self.button2 = self.builder.get_object("button2") self.button2.set_label(str(rand2[2])) self.button3 = self.builder.get_object("button3") self.button3.set_label(str(rand3[2])) self.button4 = self.builder.get_object("button4") self.button4.set_label(str(rand4[2])) self.label1 = self.builder.get_object("label1") self.label1.set_text(str(ch[1])) self.window.show() # Здесь рандом while True: # # Создаем список из непройденных слов exclude = [] for line in dic: if len(line) != 4: exclude.append(line) # Дальше магия rand1 = random.choice(exclude) rand2 = random.choice(exclude) rand3 = random.choice(exclude) rand4 = random.choice(exclude) stack = [rand1, rand2, rand3, rand4] ch = random.choice(stack) print ("Word:" + ch[1] ) print ("options:") print ("[1] " + rand1[2] + "[2] " + rand2[2] + "[3] " + rand3[2] + "[4] " + rand4[2]) if __name__ == "__main__": main = okno() Gtk.main()
Прикреплённый файлы:
freq.dict (34,5 KБ)
Офлайн
Забыл прикрепить глейд:
Отредактировано sergeich1992 (Май 29, 2015 17:58:53)
Прикреплённый файлы:
try-1.glade (4,3 KБ)
Офлайн
Ой, страшно даже разбираться в вашем коде. Но вот вам рабочий код (не менее ужасный). Смотрите внимательно что изменил.
#!/usr/bin/python3 from gi.repository import Gtk import random import os dt = [] with open('freq.dict', encoding='utf-8') as dt: dt = dt.read().splitlines() l = len(dt) # Кол-во строк в словаре x = 0 while x < int(l): # тут заполняем массив списком с числами L = [] for j in range(int(l)): L.append(x) x += 1 #Создаем вложенный список dic = [] for i in L: dic.append(dt[i].split("-")) # Разделяем части строки по дефису # Функция замены строки (нужна вся строка!) def ReplaceLineInFile(fileName, sourceText, replaceText): file = open(fileName, 'r') text = file.read() file.close() file = open(fileName, 'w') file.write(text.replace(sourceText, replaceText)) file.close() ##################################### class okno: def on_window1_destroy(self, object, data=None): print ("quit with cancel") Gtk.main_quit() def on_button1_clicked(self, button, data=None): self.label1 = self.builder.get_object("label1") reply = 1 self.check (reply) if self.ret == 0: print ('!!!') self.rand() def on_button2_clicked(self, button, data=None): self.label1 = self.builder.get_object("label1") reply = 2 self.check (reply) if self.ret == 0: print ('!!!') self.rand() def on_button3_clicked(self, button, data=None): self.label1 = self.builder.get_object("label1") reply = 3 self.check (reply) if self.ret == 0: print ('!!!') self.rand() def on_button4_clicked(self, button, data=None): self.label1 = self.builder.get_object("label1") reply = 4 self.check (reply) if self.ret == 0: print ('!!!') self.rand() def update(self): self.button1.set_label(str(self.rand1[2])) self.button2.set_label(str(self.rand2[2])) self.button3.set_label(str(self.rand3[2])) self.button4.set_label(str(self.rand4[2])) self.label1.set_text(str(self.ch[1])) def __init__(self): self.gladefile = "try-1.glade" self.builder = Gtk.Builder() self.builder.add_from_file(self.gladefile) self.builder.connect_signals(self) self.window = self.builder.get_object("window1") self.button1 = self.builder.get_object("button1") self.button2 = self.builder.get_object("button2") self.button3 = self.builder.get_object("button3") self.button4 = self.builder.get_object("button4") self.label1 = self.builder.get_object("label1") self.rand() self.window.show() def rand(self): # Здесь рандом # # Создаем список из непройденных слов exclude = [] for line in dic: if len(line) != 4: exclude.append(line) # Дальше магия self.rand1 = random.choice(exclude) self.rand2 = random.choice(exclude) self.rand3 = random.choice(exclude) self.rand4 = random.choice(exclude) self.stack = [self.rand1, self.rand2, self.rand3, self.rand4] self.ch = random.choice(self.stack) print ("Word:" + self.ch[1] ) print ("options:") print ("[1] " + self.rand1[2] + "[2] " + self.rand2[2] + "[3] " + self.rand3[2] + "[4] " + self.rand4[2]) self.update() def check (self, word): ans = self.stack[int(word)-1][2] if ans == self.ch[2]: print ("good))") self.ret = 0 else: print ("Wrong." + self.ch[1] + "-" + self.ch[2]) self.ret = 1 if __name__ == "__main__": main = okno() Gtk.main()
Отредактировано b_oss (Июнь 1, 2015 13:11:06)
Офлайн
b_oss
Ой, страшно даже разбираться в вашем коде. Но вот вам рабочий код (не менее ужасный). Смотрите внимательно что изменил.
Офлайн