Создание двух windows с помощью Tkinter и получение имени из второго окна - PullRequest
1 голос
/ 05 августа 2020

Я пытаюсь создать приложение с Tkinter, которое требует, чтобы пользователь нажал кнопку в первом окне, а затем появится новое окно, где они напишут свое имя. Но когда я пытаюсь узнать имя, всегда получаю пустую строку. Вот мой код:

from tkinter import *

class first_class(object):
    def __init__(self, window):
    
        self.window = window

        b1 = Button(window, text = "first_get", command = self.get_value_2)
        b1.grid(row = 0, column = 1)

    def get_value_2(self):
        sc = Tk()
        second_class(sc)
        sc.mainloop()

class second_class(object):
    def __init__(self, window):
        def get_value_1():
            print(self.name.get())
        self.window = window

        self.name = StringVar()
        self.e1 = Entry(window, textvariable = self.name)
        self.e1.grid(row = 0, column = 0)

        b1 = Button(window, text = "second_get", command = get_value_1)
        b1.grid(row = 0, column = 1)
        
window = Tk()
first_class(window)
window.mainloop()

Что мне делать, чтобы правильно получить имя?

1 Ответ

4 голосов
/ 05 августа 2020

Вообще говоря, вам следует избегать более одного вызова Tk() в приложении tkinter. Также вряд ли когда-либо необходимо вызывать mainloop() более одного раза.

Ваш код с указанными ниже изменениями показывает, как это сделать. Обратите внимание, что я также переименовал и переформатировал несколько вещей, чтобы он соответствовал рекомендациям из PEP 8 - Руководство по стилю для Python Code более внимательно, которое я настоятельно рекомендую вам прочитать и начать следовать.

import tkinter as tk


class FirstClass(object):
    def __init__(self, window):
        self.window = window

        b1 = tk.Button(window, text="first_get", command=self.get_value_2)
        b1.grid(row=0, column=1)

    def get_value_2(self):
#        sc = tk.Tk()  # REMOVED
        SecondClass(self.window)  # CHANGED
#        sc.mainloop()  # REMOVED


class SecondClass(object):
    def __init__(self, window):
        self.window = window

        self.name = tk.StringVar()
        self.e1 = tk.Entry(window, textvariable=self.name)
        self.e1.grid(row=0, column=0)

        def get_value_1():
            print('self.name.get():', self.name.get())

        b1 = tk.Button(window, text="second_get", command=get_value_1)
        b1.grid(row=0, column=1)


window = tk.Tk()
FirstClass(window)
window.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...