Открыть новое окно с помощью кнопки

Я создаю проект мониторинга в реальном времени, в котором информация предоставляется в первом окне, а во втором окне она постоянно обновляется. Я пытаюсь отслеживать обновленную информацию параллельно из другого окна, используя тот же код, но когда я нажал новую кнопку и получил новую информацию, она также обновляется в предыдущем окне, но я хотел окно монитора быть совершенно другим, чтобы я мог параллельно отслеживать разную информацию, используя один и тот же код. Пожалуйста, взгляните на пример кода и помогите мне с идеями.

Пример кода:

import time
import threading
import tkinter.messagebox
from tkinter import ttk
import queue
from tkinter import *

class Demo1:
    data=[]
    def __init__(self, master):#Python scrollbar on text widget
        self.master = master
        self.t=tkinter.Text(self.master,height=20,width=50)
        self.t.grid(row=1, column=1)
        self.button = tkinter.Button(self.master,height=3,width=10, text="OK", command = self.new_window)
        self.button.grid(row=2,column=1)
    def new_window(self):
        self.inputValue=self.t.get("1.0",'end-1c')
        Demo1.data1=self.inputValue.split("\n")
        self.master.destroy() # close the current window
        self.master = tkinter.Toplevel() # create another Tk instance
        self.app = Demo2(self.master) # create Demo2 window
        self.master.mainloop()

        
class Demo2:
    t1 = []
    s1 = True
    display = []
    display1 = []
    i=0
    kas = True
    num=0
    j1=0
    def __init__(self, master):
        self.master = master
        self.button = tkinter.Button(self.master,height=2,width=11, text="new",command=self.new).place(x=0,y=0)
        self.label = tkinter.Label(self.master, text="monitor", font=("Arial",20)).grid(row=0, columnspan=3)
        cols = ('aa','bb')
        self.listBox = ttk.Treeview(self.master, columns=cols)
        for col in cols:
            self.listBox.heading(col, text=col)
            self.listBox.column(col,minwidth=0,width=170)
        self.listBox.grid(row=1, column=0)
        self.a()
    def a(self):
        self._img=tkinter.PhotoImage(file="green1.gif")
        a=Demo1.data1
        for i,(a) in enumerate(a): #here I have some function which runs repeatedlly  
            self.listBox.insert('', 'end',image=self._img, value=(a))
        threading.Timer(1.0, self.a).start()
    def new(self):
        main()

                            
def main():
    root = tkinter.Toplevel()
    app = Demo1(root)
    root.mainloop()


if __name__ == '__main__':
    main()

Я дал информацию pppp для мониторинга, но как нажатую новую кнопку и добавил информацию xx, ее обновление в предыдущее окно также. Пожалуйста, помогите мне с идеей, чтобы связь между этими окнами исчезла.

Выход:

введите здесь описание изображения


person Jung-suk    schedule 30.07.2020    source источник


Ответы (1)


У вас серьезные проблемы с программой. В том числе, как вы пытаетесь использовать свои классы. Объект Toplevel() вызывал у меня проблемы, поэтому я использовал Tk(). Это должно показать вам, как правильно использовать классы с окном. Самое главное, ваше второе окно должно быть создано из глобального, а не первого окна. Также Demo1.data является ссылкой на определение вашего класса, а не на фактические данные, которые вы загрузили. Я надеюсь, что этот пример будет полезен.

from tkinter import *

 # your second window should be created in global
def create_demo2():
    global app, app2
    root2 = Tk()
    app2 = Demo2(root2, app)


class Demo1:
    def __init__(self, window):
        self.window = window
        self.data = ""
        self.button = Button(self.window, text="New Window",
                             command=create_demo2)
        self.button.pack()

    def set_data(self):
        self.data = "data"


class Demo2:
 # you could just use app from global scope, but I like to pass so that it is explicit.
    def __init__(self, window, app1): 
        self.window = window
        self.button_set = Button(self.window, text="Set", command=app1.set_data)
        self.button_use = Button(self.window, text="Use", command=self.use_data)
        self.app = app1
        self.label = Label(self.window)
        self.button_set.pack()
        self.button_use.pack()
        self.label.pack()

    def use_data(self):
        self.label.configure(text=self.app.data)


root = Tk()
app = Demo1(root)
app2 = None

root.mainloop()
person ShayneLoyd    schedule 30.07.2020