【问题标题】:Pass Data between Windows在 Windows 之间传递数据
【发布时间】:2021-12-18 18:19:41
【问题描述】:

我是这个论坛的新手,有一个问题困扰了我好几天。 出于练习目的,我创建了两个窗口,第二个窗口被称为模块“textbetrachter”,来自第一个窗口(MainWindow)。 就所有而言,第二个窗口是通过组合键“Self.Bind(”“,Self.win2)”调用的,效果和我说的一样。

我的问题是:如何在第二个窗口(Toplevel)上传递变量“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"))

所以在第二个窗口中。我想继续使用变量“liste”,但不幸的是这不起作用。如果有人可以在这里帮助我,我会非常高兴。

问候 SC19

【问题讨论】:

  • 快速解决方案:win2方法中将out注释行替换为setattr(self.mein_textbetrachter.win, "liste",self.liste)

标签: tkinter toplevel


【解决方案1】:

您可以将列表传递到第二个窗口。

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。您的程序只需要一个事件循环。

【讨论】:

  • 对于 Python,这两种变体似乎没有区别,我可以传递几个变量。而且我可以将参数“mainwindow”也称为“xyz”它无论如何都可以工作。有人能解释一下为什么会这样吗?
  • @sc19:你说得对,变体之间几乎没有区别。关键是,如果一个对象需要引用另一个对象中的某些东西,它需要对该对象或该对象的属性的引用。是的,您可以将参数命名为其他类中的任何名称。名称无关紧要,重要的是变量所指的内容。
猜你喜欢
  • 2016-08-04
  • 1970-01-01
  • 2014-09-16
  • 2017-06-10
  • 1970-01-01
  • 1970-01-01
  • 2014-05-22
  • 2011-06-20
  • 1970-01-01
相关资源
最近更新 更多