在 Windows 之间传递数据
Pass Data between Windows
我是这个论坛的新人,有一个问题困扰了我好几天。
出于练习目的,我创建了两个 Windows,第二个 Windows 被称为来自第一个 Window(MainWindow)的模块“textbetrachter”。
就所有而言,第二个 window 是通过组合键“Self.Bind (" ", Self.win2)" 调用的,效果和我说的一样好。
我的问题是:如何在第 2 个 Window(顶层)上传递变量“liste”(值),以继续在那里工作。正是在这一点上,我只是犯了一个编程错误。
错误信息是:
打印 (self.win.list)
AttributeError: 'Toplevel' 对象没有属性 'List'
这是我自己制作的程序:
import tkinter as tk
from tkinter import ttk
import textbetrachter
class MainWindow(tk.Tk):
def __init__(self):
super(MainWindow, self).__init__()
self.title("Lektion: Frame-Widget")
frame_01 = tk.Frame(self, bg="red", width=600, height=200)
frame_01.grid(column=0, row=0, padx=5, pady=5, sticky="w")
frame_01a = tk.LabelFrame(frame_01, text="Rahmen 1:", bg="gray", width=330, height=190)
frame_01a.grid(column=0, row=0, padx=5, pady=5)
frame_01b = tk.LabelFrame(frame_01, text="Rahmen 2:", bg="lightgray", width=330, height=190)
frame_01b.grid(column=2, row=0, padx=(0,5), pady=5)
self.liste = frame_01.config()
self.bind("<Control-s>",self.win2)
def win2(self, event):
self.mein_textbetrachter = textbetrachter.Textbetrachter()
#self.mein_textbetrachter.win.liste
self.mein_textbetrachter.win.mainloop()
root = MainWindow()
root.mainloop()
这是模块“textbetrachter”(另存为textbetrachter.py):
import tkinter as tk
from tkinter import ttk
class Textbetrachter():
def __init__(self):
self.win = tk.Toplevel()
self.win.title("Textbetrachter")
self.win.resizable(False, False)
frame_02 = tk.Frame(self.win, bg="green")
frame_02.grid(column=0, row=0, padx=5, pady=5)
texteditor = tk.Text(frame_02, bg="lightyellow", height=20)
texteditor.grid(column=0, row=0, padx=5, pady=5)
text_scroller = tk.Scrollbar(frame_02, orient="vertical", command=texteditor.yview)
text_scroller.grid(column=1, row=0, sticky="ns")
print(self.win.liste)
for item in self.win.liste.config():
texteditor.insert(tk.INSERT, (item, ":", self.win.liste[item], "\n"))
所以在第二个 window。我想继续使用变量“liste”,但不幸的是这不起作用。如果有人能在这里帮助我,我会很高兴。
问候
SC19
您可以将列表传递给第二个 window。
class Textbetrachter():
def __init__(self, liste):
self.liste = liste
...
class MainWindow(tk.Tk):
...
def win2(self, event):
self.mein_textbetrachter = textbetrachter.Textbetrachter(self.liste)
...
如果需要共享多个变量,则传递 MainWindow
的实例:
class Textbetrachter():
def __init__(self, mainwindow):
self.mainwindow = mainwindow
...
print(self.mainwindow.liste)
class MainWindow(tk.Tk):
...
def win2(self, event):
self.mein_textbetrachter = textbetrachter.Textbetrachter(self)
...
此外,您不应该在 MainWindow
中调用 mainloop
。您的程序只需要一个事件循环。
我是这个论坛的新人,有一个问题困扰了我好几天。 出于练习目的,我创建了两个 Windows,第二个 Windows 被称为来自第一个 Window(MainWindow)的模块“textbetrachter”。 就所有而言,第二个 window 是通过组合键“Self.Bind (" ", Self.win2)" 调用的,效果和我说的一样好。
我的问题是:如何在第 2 个 Window(顶层)上传递变量“liste”(值),以继续在那里工作。正是在这一点上,我只是犯了一个编程错误。 错误信息是:
打印 (self.win.list) AttributeError: 'Toplevel' 对象没有属性 'List'
这是我自己制作的程序:
import tkinter as tk
from tkinter import ttk
import textbetrachter
class MainWindow(tk.Tk):
def __init__(self):
super(MainWindow, self).__init__()
self.title("Lektion: Frame-Widget")
frame_01 = tk.Frame(self, bg="red", width=600, height=200)
frame_01.grid(column=0, row=0, padx=5, pady=5, sticky="w")
frame_01a = tk.LabelFrame(frame_01, text="Rahmen 1:", bg="gray", width=330, height=190)
frame_01a.grid(column=0, row=0, padx=5, pady=5)
frame_01b = tk.LabelFrame(frame_01, text="Rahmen 2:", bg="lightgray", width=330, height=190)
frame_01b.grid(column=2, row=0, padx=(0,5), pady=5)
self.liste = frame_01.config()
self.bind("<Control-s>",self.win2)
def win2(self, event):
self.mein_textbetrachter = textbetrachter.Textbetrachter()
#self.mein_textbetrachter.win.liste
self.mein_textbetrachter.win.mainloop()
root = MainWindow()
root.mainloop()
这是模块“textbetrachter”(另存为textbetrachter.py):
import tkinter as tk
from tkinter import ttk
class Textbetrachter():
def __init__(self):
self.win = tk.Toplevel()
self.win.title("Textbetrachter")
self.win.resizable(False, False)
frame_02 = tk.Frame(self.win, bg="green")
frame_02.grid(column=0, row=0, padx=5, pady=5)
texteditor = tk.Text(frame_02, bg="lightyellow", height=20)
texteditor.grid(column=0, row=0, padx=5, pady=5)
text_scroller = tk.Scrollbar(frame_02, orient="vertical", command=texteditor.yview)
text_scroller.grid(column=1, row=0, sticky="ns")
print(self.win.liste)
for item in self.win.liste.config():
texteditor.insert(tk.INSERT, (item, ":", self.win.liste[item], "\n"))
所以在第二个 window。我想继续使用变量“liste”,但不幸的是这不起作用。如果有人能在这里帮助我,我会很高兴。
问候 SC19
您可以将列表传递给第二个 window。
class Textbetrachter():
def __init__(self, liste):
self.liste = liste
...
class MainWindow(tk.Tk):
...
def win2(self, event):
self.mein_textbetrachter = textbetrachter.Textbetrachter(self.liste)
...
如果需要共享多个变量,则传递 MainWindow
的实例:
class Textbetrachter():
def __init__(self, mainwindow):
self.mainwindow = mainwindow
...
print(self.mainwindow.liste)
class MainWindow(tk.Tk):
...
def win2(self, event):
self.mein_textbetrachter = textbetrachter.Textbetrachter(self)
...
此外,您不应该在 MainWindow
中调用 mainloop
。您的程序只需要一个事件循环。