СПРОСИ ПРОФИ
👍
0
👎 00

Импортирование классов в питоне + импортирование модуля tkinter

Добрый вечер!
Я готовлю проект по информатике по теме: «Изучение иностранных слов при помощи виджета». Но во время создания программы я столкнулся с очень странной и необъяснимой проблемой
Программа состоит из двух виджетов: один дает пользователю выбрать команду(переводить с рус на англ, наоборот и словарь)
а уже следующий делает выбранный пользователем вариант.
Проблема заключается в том, что если я использую два виджета сразу, то кнопки во втором виджете не реагируют на объекты, на которые ссылаются.
Но стоит мне напрямую запустить второй виджет, как сразу все работает.


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 ссылается на значение 'Собака', но это я сделал на время. После переменная будет ссылаться на базу данных.
Заранее большое спасибо!!!

Задайте свой вопрос программистам –
профессионалам

Сейчас онлайн 75 программистов
Получите ответ профи быстро и бесплатно
ASK.PROFI.RU © 2020-2024