Как я могу обновить окно tkinter с новой определенной переменной? - PullRequest
0 голосов
/ 24 апреля 2019

Я хочу создать два окна с одной кнопкой в ​​первом и одним ярлыком во втором.Когда я нажимаю кнопку, метка во втором окне должна обновиться и отобразить переменную плюс 1.

Я не хочу закрывать второе окно и открывать его впоследствии.Любые идеи, как это можно сделать?

import tkinter as tk

text = 1
root = tk.Tk()
root2 = tk.Tk()

label = tk.Label(root, bg="green", text=text, fg="blue")
label.place(relx=0.1, rely=0.1, relheight=0.3, relwidth=0.3)

def plus():
    global text
    text = text + 1

    print(text)


button = tk.Button(root2, bg="blue", text="Button", command=plus)
button.pack()

root.mainloop()
root2.mainloop()

Этот код должен сделать основы, но строка для обновления второго окна все еще отсутствует.

Надеюсь, кто-нибудь может сказать мне, как это сделать:)

Ответы [ 4 ]

0 голосов
/ 24 апреля 2019

Используйте Toplevel() окно вместо использования Tk() в качестве дополнительных окон. Tkinter является однопоточным, поэтому для всех окон достаточно одного mainloop().

Теперь, когда вы попросили, чтобы вы хотели одну кнопку в одном окне и метку, которая обновляется во втором окне, а также вы можете открыть окно без потери прогресса, если закроете второе окно.

Вот мой путь.

import tkinter as tk

text = 1
root = tk.Tk()
root2 = tk.Toplevel()

label = tk.Label(root2, bg="green", text=text, fg="blue")
label.place(relx=0.1, rely=0.1, relheight=0.3, relwidth=0.3)

def plus():
    global text, root2, label
    if not root2.winfo_exists():  # checks if the window is closed or not
        root2 = tk.Toplevel()
        label = tk.Label(root2, bg="green", text=text, fg="blue")
        label.place(relx=0.1, rely=0.1, relheight=0.3, relwidth=0.3)

    text += 1
    label['text'] = text

button = tk.Button(root, bg="blue", text="Button", command=plus)
button.pack()

root.mainloop()

Использование IntVar() для обновления всех значений метки. Можно использовать StringVar() для типа жала:

Sample

import tkinter as tk

root = tk.Tk()
root2 = tk.Toplevel()

# This is a textvariable IntVar can also use StringVar for sting input
text = tk.IntVar()   
text.set(1)             # Set the initial to 1

# Use 'textvariable' instad of text
label = tk.Label(root2, bg="green", textvariable=text, fg="blue")
label.place(relx=0.1, rely=0.1, relheight=0.3, relwidth=0.3)

label2 = tk.Label(root, textvariable=text)
label2.pack()

def plus():
    global text, root2, label
    if not root2.winfo_exists():  # checks if the window is closed or not
        root2 = tk.Toplevel()
        label = tk.Label(root2, bg="green", textvariable=text, fg="blue")
        label.place(relx=0.1, rely=0.1, relheight=0.3, relwidth=0.3)

    text.set( text.get()+1 )     # incrementing by 1 ( text.get() will return the value )

button = tk.Button(root, bg="blue", text="Button", command=plus)
button.pack()

root.mainloop()

Надеюсь, вы найдете что-нибудь полезное из моего ответа.

0 голосов
/ 24 апреля 2019

Чтобы расширить уже полученный ответ, вы должны использовать Toplevel, а не два корневых окна.Также для изменения текста метки вы используете label['text'] = str(text) для обновления значения.

import tkinter as tk

text = 1
root = tk.Tk()
root2 = tk.Toplevel()

def plus():
    global text
    text = text + 1
    label['text'] = str(text)

label = tk.Label(root, bg="green", text=text, fg="blue")
label.place(relx=0.1, rely=0.1, relheight=0.3, relwidth=0.3)


button = tk.Button(root2, bg="blue", text="Button", command=plus)
button.pack()

root.mainloop()
0 голосов
/ 24 апреля 2019

Если я поняла, попробуйте это, каждый раз, когда вы открываете окно, на верхнем уровне, метка в новом окне увеличивается на 1

import tkinter as tk

class Test(tk.Toplevel):

    def __init__(self, parent, count):
        super().__init__()

        self.parent =  parent
        self.count = tk.IntVar()
        self.count.set(count)

        self.title("I'm a new toplevel.")
        self.init_ui()

    def init_ui(self):

        self.label = tk.Label(self, textvariable=self.count).pack()
        self.close_me = tk.Button(self, text= "Close me", command = self.on_close_me).pack()
        self.close_parent = tk.Button(self, text= "Close parent", command = self.on_close_parent).pack()

    def on_close_me(self):
        self.destroy()        

    def on_close_parent(self):
        self.parent.on_close()


class App(tk.Frame):

    def __init__(self,):

        super().__init__()

        self.master.title("Hello World")

        self.count =0

        self.init_ui()

    def init_ui(self):

        self.pack(fill=tk.BOTH, expand=1,)

        f = tk.Frame()

        w = tk.Frame()

        tk.Button(w, text="Open", command=self.callback).pack()
        tk.Button(w, text="Close", command=self.on_close).pack()

        f.pack(side=tk.LEFT, fill=tk.BOTH, expand=0)
        w.pack(side=tk.RIGHT, fill=tk.BOTH, expand=0)


    def callback(self):
        self.count +=1
        obj = Test(self,self.count)

    def on_close(self,evt=None):
        self.master.destroy()

if __name__ == '__main__':
    app = App()
    app.mainloop()
0 голосов
/ 24 апреля 2019

Вы не можете запустить два основных цикла в одном потоке.Ваш звонок на root.mainloop() блокируется, пока вы не закроете окно.Как только вы закроете окно, оно выйдет из этого метода и запустит root2.mainloop(), потому что это следующая строка кода.

Одна корневая панель может иметь несколько окон, вам не нужно создавать root2.Вы хотите сделать два трехуровневых окна

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...