Добрый вечер!
Я готовлю проект по информатике по теме: «Изучение иностранных слов при помощи виджета». Но во время создания программы я столкнулся с очень странной и необъяснимой проблемой
Программа состоит из двух виджетов: один дает пользователю выбрать команду(переводить с рус на англ, наоборот и словарь)
а уже следующий делает выбранный пользователем вариант.
Проблема заключается в том, что если я использую два виджета сразу, то кнопки во втором виджете не реагируют на объекты, на которые ссылаются.
Но стоит мне напрямую запустить второй виджет, как сразу все работает.
1) Здесь я попытался запихнуть все в одну программу, но кнопки второго виджета не работают (Пока можно выбрать только вариант: С английского на русский, а потом ничего не работает ).
Эта программа демонстрирует группу виджетов Radiobutton.
import tkinter
class MyGUI:
def init(self):
self.main_window = tkinter.Tk()
# Создать две рамки: одну для виджетов Radiobutton
# и еще одну для обычных виджетов Button.
self.top_frame = tkinter.Frame(self.main_window)
self.bottom_frame = tkinter.Frame(self.main_window)
# Создать объект IntVar для использования
# с виджетами Radiobutton.
self.radio_var = tkinter.IntVar()
# Назначить объекту IntVar значение 1.
self.radio_var.set(1)
# Создать виджеты Radiobutton в рамке top_frame.
self.rb1 = tkinter.Radiobutton(self.top_frame,
text = 'С английского на русский',
variable = self.radio_var,
value = 1)
self.rb2 = tkinter.Radiobutton(self.top_frame,
text = 'С русского на английский',
variable = self.radio_var,
value = 2)
self.rb3 = tkinter.Radiobutton(self.top_frame,
text = 'Редактировать словарь',
variable = self.radio_var,
value = 3)
# Упаковать виджеты Radiobutton.
self.rb1.pack()
self.rb2.pack()
self.rb3.pack()
# Создать кнопку 'ОК' и кнопку 'Выйти'.
self.ok_button = tkinter.Button(self.bottom_frame,
text = 'OK',
command = self.show_choice)
self.quit_button = tkinter.Button(self.bottom_frame,
text = 'Выйти',
command = self.main_window.destroy)
# Упаковать виджеты Button.
self.ok_button.pack(side = 'left')
self.quit_button.pack(side = 'left')
# Упаковать рамки.
self.top_frame.pack()
self.bottom_frame.pack()
tkinter.mainloop()
# Метод show_choice для кнопки ОК.
def show_choice(self):
choice = self.radio_var.get()
if choice == 1:
c = self.EngRus()
elif choice == 2:
pass
else:
pass
def EngRus(self):
# Создать объект
self.main_window = tkinter.Tk()
# Создать три рамки.
self.top_frame = tkinter.Frame(self.main_window)
self.answer_frame = tkinter.Frame(self.main_window)
self.mid_frame = tkinter.Frame(self.main_window)
self.bottom_frame = tkinter.Frame(self.main_window)
# Создать и упаковать виджеты для рамки top_frame.
self.word = tkinter.Label(self.top_frame,
text = 'слово')
self.answer = tkinter.Entry(self.top_frame,
width = 10)
self.word.pack(side = 'left')
self.answer.pack(side = 'left')
# Создать запись проверки ответа.
self.value = tkinter.StringVar()
self.check = tkinter.Label(self.answer_frame,
textvariable = self.value)
self.check.pack(side = 'left')
# Создать и упаковать кнопку для рамки mid_frame.
self.button = tkinter.Button(self.mid_frame,
text = 'Ответить',
command = self.convert)
self.next = tkinter.Button(self.mid_frame,
text = 'Продолжить')
self.button.pack(side = 'left')
self.next.pack(side = 'left')
# Создать кнопку для вывода.
self.quit_button = tkinter.Button(self.bottom_frame,
text = 'Назад',
command = self.main_window.destroy)
self.quit_button.pack(side = 'right')
# Закрыть все рамки.
self.top_frame.pack()
self.answer_frame.pack()
self.mid_frame.pack()
self.bottom_frame.pack()
tkinter.mainloop()
def convert(self):
translation = 'База данных'
answer = self.answer.get()
if translation == answer:
self.value.set('Верно')
else:
self.value.set('Неверно')
if name == 'main':
my_gui = MyGUI()
2) Здесь я разделил два виджета по двум файлом, но проблема такая же + плюс выскакивает странная ошибка при закрытии программы.
Эта программа демонстрирует группу виджето Radiobutton.
import tkinter
import Виджетыf
class MyGUI:
def init(self):
self.main_window = tkinter.Tk()
# Создать две рамки: одну для виджетов Radiobutton
# и еще одну для обычных виджетов Button.
self.top_frame = tkinter.Frame(self.main_window)
self.bottom_frame = tkinter.Frame(self.main_window)
# Создать объект IntVar для использования
# с виджетами Radiobutton.
self.radio_var = tkinter.IntVar()
# Назначить объекту IntVar значение 1.
self.radio_var.set(1)
# Создать виджеты Radiobutton в рамке top_frame.
self.rb1 = tkinter.Radiobutton(self.top_frame,
text = 'С английского на русский',
variable = self.radio_var,
value = 1)
self.rb2 = tkinter.Radiobutton(self.top_frame,
text = 'С русского на английский',
variable = self.radio_var,
value = 2)
self.rb3 = tkinter.Radiobutton(self.top_frame,
text = 'Редактировать словарь',
variable = self.radio_var,
value = 3)
# Упаковать виджеты Radiobutton.
self.rb1.pack()
self.rb2.pack()
self.rb3.pack()
# Создать кнопку 'ОК' и кнопку 'Выйти'.
self.ok_button = tkinter.Button(self.bottom_frame,
text = 'OK',
command = self.show_choice)
self.quit_button = tkinter.Button(self.bottom_frame,
text = 'Выйти',
command = self.main_window.destroy)
# Упаковать виджеты Button.
self.ok_button.pack(side = 'left')
self.quit_button.pack(side = 'left')
# Упаковать рамки.
self.top_frame.pack()
self.bottom_frame.pack()
tkinter.mainloop()
# Метод show_choice для кнопки ОК.
def show_choice(self):
choice = self.radio_var.get()
if choice == 1:
c = Виджетыf.Widget()
c.EngRus()
c.convert()
elif choice == 2:
pass
else:
pass
if name == 'main':
my_gui = MyGUI()
название второго файла: Виджетыf
С английского на русский.
import tkinter
class Widget:
def EngRus(self):
# Создать объект
self.main_window = tkinter.Tk()
# Создать три рамки.
self.top_frame = tkinter.Frame(self.main_window)
self.answer_frame = tkinter.Frame(self.main_window)
self.mid_frame = tkinter.Frame(self.main_window)
self.bottom_frame = tkinter.Frame(self.main_window)
# Создать и упаковать виджеты для рамки top_frame.
self.word = tkinter.Label(self.top_frame,
text = 'слово')
self.answer = tkinter.Entry(self.top_frame,
width = 10)
self.word.pack(side = 'left')
self.answer.pack(side = 'left')
# Создать запись проверки ответа.
self.value = tkinter.StringVar()
self.check = tkinter.Label(self.answer_frame,
textvariable = self.value)
self.check.pack(side = 'left')
# Создать и упаковать кнопку для рамки mid_frame.
self.button = tkinter.Button(self.mid_frame,
text = 'Ответить',
command = self.convert)
self.next = tkinter.Button(self.mid_frame,
text = 'Продолжить')
self.button.pack(side = 'left')
self.next.pack(side = 'left')
# Создать кнопку для вызода.
self.quit_button = tkinter.Button(self.bottom_frame,
text = 'Назад',
command = self.main_window.destroy)
self.quit_button.pack(side = 'right')
# Закрыть все рамки.
self.top_frame.pack()
self.answer_frame.pack()
self.mid_frame.pack()
self.bottom_frame.pack()
tkinter.mainloop()
def convert(self):
translation = 'Собака'
answer = self.answer.get()
if translation == answer:
self.value.set('Верно')
else:
self.value.set('Неверно')
3) Но стоит мне отдельно запустить второй виджет, как все сразу работает.
С английского на русский.
import tkinter
class Widget:
def EngRus(self):
# Создать объект
self.main_window = tkinter.Tk()
# Создать три рамки.
self.top_frame = tkinter.Frame(self.main_window)
self.answer_frame = tkinter.Frame(self.main_window)
self.mid_frame = tkinter.Frame(self.main_window)
self.bottom_frame = tkinter.Frame(self.main_window)
# Создать и упаковать виджеты для рамки top_frame.
self.word = tkinter.Label(self.top_frame,
text = 'слово')
self.answer = tkinter.Entry(self.top_frame,
width = 10)
self.word.pack(side = 'left')
self.answer.pack(side = 'left')
# Создать запись проверки ответа.
self.value = tkinter.StringVar()
self.check = tkinter.Label(self.answer_frame,
textvariable = self.value)
self.check.pack(side = 'left')
# Создать и упаковать кнопку для рамки mid_frame.
self.button = tkinter.Button(self.mid_frame,
text = 'Ответить',
command = self.convert)
self.next = tkinter.Button(self.mid_frame,
text = 'Продолжить')
self.button.pack(side = 'left')
self.next.pack(side = 'left')
# Создать кнопку для вызода.
self.quit_button = tkinter.Button(self.bottom_frame,
text = 'Назад',
command = self.main_window.destroy)
self.quit_button.pack(side = 'right')
# Закрыть все рамки.
self.top_frame.pack()
self.answer_frame.pack()
self.mid_frame.pack()
self.bottom_frame.pack()
tkinter.mainloop()
def convert(self):
translation = 'Собака'
answer = self.answer.get()
if translation == answer:
self.value.set('Верно')
else:
self.value.set('Неверно')
if name == 'main':
cl = Widget()
cl.EngRus()
Скажите пожалуйста, как мне все это объединить, чтобы все работало?
Единственное, что мне сейчас нужно — это чтобы при нажатии кнопки ответить выводилось 'правильно' или 'неправильно'. Переменная translation ссылается на значение 'Собака', но это я сделал на время. После переменная будет ссылаться на базу данных.
Заранее большое спасибо!!!