【问题标题】:Python and TkinterPython 和 Tkinter
【发布时间】:2014-04-12 18:01:46
【问题描述】:

我不确定这里是否适合提出这样的问题,但作为一名新的 Python 开发者,我希望有人向我解释 Python 的 Tkinter 小程序。

程序:

from Tkinter import *
master = Tk()

e = Entry(master)
e.pack()
root = Tk()
text = Text(root)
e.focus_set()
text.pack()
def callback():
          text.insert(INSERT, e.get())

b = Button(master, text="Start", width=10, command=callback)
b.pack()
mainloop()
root.mainloop() 

这个程序运行良好,但遵循here 的文档,我仍然对一些事情感到困惑。

  1. 什么是 Enter(主)
  2. e.pack()
  3. 文本(根)
  4. text.pack()
  5. 主循环()
  6. root.mainloop()

谢谢!!!

【问题讨论】:

    标签: python tkinter


    【解决方案1】:
    1. Entry(master)在父窗口master内定义了一个输入框。

    2. e.pack 定义了在父窗口中e 将出现的位置——如果我们不设置它的几何形状,它将不会出现。有几个几何管理器,但pack() 只适合任何有空间的地方。

    3. Text(root) 定义了一个简单的Text 小部件,其中......好吧,您可以在其中存储文本。它使用Tk() 窗口root 作为其父窗口。

    4. text.pack() 与 2 相同,只有 Text 小部件,而不是 Entry 小部件。

    5. mainloop() 将启动先前定义的Tk() 窗口的事件循环。 (见下文)。

    6. root.mainloop() 启动 Tk() 窗口 root 的事件循环。即,您正在阻塞您的主程序,直到 UI 上发生触发事件的事件。

    【讨论】:

    • @user3339224: “允许它出现并与之交互” 是不正确的,因为之前的mainloop() 阻塞直到两个顶级窗口关闭。也无需调用Tk() 两次,见Tkinter example code for multiple windows, why won't buttons load correctly?
    • @J.F.Sebastian 因为它是来自网站的教程脚本,所以它被设计成单独组件来解释。此外,他还特别要求独立提供这些功能。因此,我认为我的回答可以很好地向初学者解释。
    【解决方案2】:

    如果你考虑大师,从这条线上:

    master = Tk()
    

    代表一种主“腔”,所有后续小部件都将适合该“腔”

    e = Entry(master)
    

    这一行分配给e,这是Entry 小部件类的一个实例。这个小部件将进入master

    e.pack()
    

    这一行实际上“打包”e 内部 master

    对于text = Text(root)text.pack(),基本上发生了同样的事情,除了root 现在是Text 小部件被“打包”到的“空腔”。我以前从未见过在这样的程序中将两个不同的变量分配给Tk(),但我没有太多经验,所以这可能没问题。

    我建议你阅读以下内容,这真的有助于我理解 tkinter:

    Thinking in Tkinter

    这个网站是一个很棒的 Tkinter 参考和介绍基础知识,包括像 EntryText 这样的小部件:

    http://effbot.org/tkinterbook/

    【讨论】:

    • 谢谢,您的回答帮助我解决了问题。你是对的,Tk() 应该使用一次,但现在当我的概念得到澄清后,我尝试使用它,并且当我使用它一次时它运行良好。在它打开两个单独的画布之前,现在它在同一个对话框/画布中工作。
    【解决方案3】:

    什么是 Enter(master)

    根据您提供的文档:

    Entry(master=None, **options) (class) [#]
    
        A text entry field.
    

    所以基本上,您将一个 Text 输入字段绑定到 UI,即您分配给 master 变量的 Tk() 实例。

    e.pack()

    当您“打包”一个小部件时,实际上是将它绑定到负责将其定位到 UI 中的 geometry manager

    文本(根)

    现在你对multiline input做同样的事情

    text.pack()

    然后再次将其打包到几何管理器。

    主循环()

    root.mainloop()

    现在您正在为两个 UI 调用事件循环,即您正在阻塞您的主程序,直到 UI 上发生触发事件的事件。唯一的问题是,在第一个窗口关闭之前,第二个调用将不起作用,因为第一个调用会阻塞主应用程序线程,直到您关闭窗口。

    【讨论】:

      猜你喜欢
      • 2021-06-12
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 2012-04-26
      • 2014-05-11
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多