Найти - Пользователи
Полная версия: Закрытие окна GTK
Начало » GUI » Закрытие окна GTK
1
sergeich1992
Начал изучать 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()
sergeich1992
Забыл прикрепить глейд:
b_oss
Ой, страшно даже разбираться в вашем коде. Но вот вам рабочий код (не менее ужасный). Смотрите внимательно что изменил.
#!/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()
sergeich1992
b_oss
Ой, страшно даже разбираться в вашем коде. Но вот вам рабочий код (не менее ужасный). Смотрите внимательно что изменил.

Очень признателен за помощь в этом хаосе. Высылайте адрес - пришлю пива) Для меня такие поправки - ценный урок.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB