- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是 Stack Overflow 的新成员。我找到了这个线程,但不允许对其发表评论或提问,所以我想我只能在这里引用它:How can I make a in interactive list in Python's Tkinter complete with buttons that can edit those listings?
from tkinter import *
import os
import easygui as eg
class App:
def __init__(self, master):
frame = Frame(master)
frame.pack()
# character box
Label(frame, text = "Characters Editor").grid(row = 0, column = 0, rowspan = 1, columnspan = 2)
charbox = Listbox(frame)
for chars in []:
charbox.insert(END, chars)
charbox.grid(row = 1, column = 0, rowspan = 5)
charadd = Button(frame, text = " Add ", command = self.addchar).grid(row = 1, column = 1)
charremove = Button(frame, text = "Remove", command = self.removechar).grid(row = 2, column = 1)
charedit = Button(frame, text = " Edit ", command = self.editchar).grid(row = 3, column = 1)
def addchar(self):
print("not implemented yet")
def removechar(self):
print("not implemented yet")
def editchar(self):
print("not implemented yet")
root = Tk()
root.wm_title("IA Development Kit")
app = App(root)
root.mainloop()
有人能给我解释一下为什么最后一行是 root.mainloop() 吗?作为 Python 的新手,并且来自面向过程的背景,没有面向对象的经验,我本以为它会是 app.mainloop()。
事实上 app = App(root) ,在其余代码中再也不会使用 app 了!我无法理解为什么 root.mainloop() 仍然有效。
最佳答案
我不确定您是否会发现这个答案令人满意,但是您调用了 root.mainloop()
因为 root
是具有 的对象mainloop
方法。在您提供的代码中,App
没有mainloop
函数。
简单来说,这就是 tkinter 的工作方式——您总是通过调用根窗口的 mainloop
方法来结束您的脚本。当该方法返回时,您的程序将退出。
让我们从头说起。最简单的非 OO Tkinter 程序将类似于以下示例。请注意,这是一个 python 2.x 示例,我没有使用全局导入,因为我认为全局导入很糟糕。
import Tkinter as tk
root = tk.Tk()
<your widgets go here>
root.mainloop()
许多人发现纯过程式风格并不是编写代码的有效方式,因此他们可能会选择以面向对象的风格来编写代码。将“应用程序”视为单例对象是很自然的。有很多方法可以做到这一点——不幸的是,你的问题中的方法不是更清晰的方法之一。
在我看来,一个稍微好一点的方法是像这样构造代码:
class App(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
<your widgets go here>
app = App()
app.mainloop()
在这种情况下,mainloop
仍然被调用,尽管现在它是 App
的一个方法,因为 App
继承自 Tk
。它在概念上与 root.mainloop()
相同,因为在这种情况下,app
是根窗口,尽管它的名称不同.
因此,在这两种情况下,mainloop
都是属于根窗口的方法。在这两种情况下,都必须调用它才能使 GUI 正常运行。
还有第三种变体,即您选择的代码所使用的变体。对于这种变体,有几种方法可以实现它。变化是您的问题使用类来定义 GUI,但不继承自 Tk
。这很好,但您仍然必须在某个时候调用 mainloop
。由于您没有在您的类中创建(或继承)mainloop
函数,因此您必须调用与根窗口关联的函数。我所说的变体是将 App
实例添加到根窗口的方式和位置,以及最终调用 mainloop
的方式。
我个人更喜欢 App
继承自 Frame
,并且您将应用程序打包到 应用程序的定义之外。我使用的模板如下所示:
class App(tk.Frame):
def __init__(self, *args, **kwargs):
tk.Frame.__init__(self, *args, **kwargs)
<your widgets go here>
if __name__ == "__main__":
root = tk.Tk()
app = App(root)
app.pack(fill="both", expand=True)
root.mainloop()
在最后一个例子中,app
和root
是两个完全不同的对象。 app
表示存在于根窗口内部 的框架。框架通常以这种方式使用,作为其他小部件组的容器。
因此,在所有情况下,都必须调用 mainloop
。 在哪里调用它以及如何调用它在一定程度上取决于您的编码风格。有些人喜欢从根窗口继承,有些人则不喜欢。无论哪种情况,您都必须调用根窗口的 mainloop
函数。
关于Python:Tkinter:为什么是 root.mainloop() 而不是 app.mainloop(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22698980/
我试图找到一些关于 tk.mainloop() 与 root.mainloop() 的使用的问答或文章,但没有成功。 我的问题是:这两种用途之间有什么区别吗?对我来说,正确的方法是使用 tk_inst
我是 Stack Overflow 的新成员。我找到了这个线程,但不允许对其发表评论或提问,所以我想我只能在这里引用它:How can I make a in interactive list in
我是 python 的新手,正在尝试设置功能测试环境。测试环境应通过 DBus 接收信号并对其进行评估。 DBus 信号使用 GLib MainLoop。我有以下封装循环的类: class Signa
我有一个 Python 脚本,可以根据 D-Bus 事件执行操作,这是其简化版本: import dbus from dbus.mainloop.glib import DBusGMainLoop i
有没有办法让我在后台运行 mainloop()?我不想增加线程的复杂性。提前致谢。 最佳答案 没有。 GUI 框架的主循环必须始终在前台运行。 关于Python:有没有办法让我在后台运行 mainlo
这不是 Python tkinter mainloop not quitting on closing the window 的副本 我有一个基于 tkinter 构建的应用程序。我观察到有时在我使用
我正在尝试创建一个使用 tkinter 显示图像的程序。到目前为止,我编写的代码完美地显示了图像,但是程序在 tkinter 窗口关闭之前不会继续。我想知道是否有任何函数代替 .mainloop()
我正在使用 wxWdigets(确切地说是 wxPython)来显示一些模式对话框。 本页https://wxpython.org/Phoenix/docs/html/wx.EventLoopBase
应用简介: 我有 Cordova/Ionic 应用程序和自定义 Cordova 插件以执行 native 代码。 插件包含单独的 CameraActivity(扩展 FragmentActivity)
在主程序主循环中,我正在通过调用 tibemsMsgConsumer_Receive 来收听 EMS 主题。同时,我想在特定时间退出程序,比如下午 5 点。我该如何实现? 我尝试使用以下代码,但在没有
我有来自 online tutorial 的以下代码通过制作一个在单击鼠标时改变状态的 parking 灯来学习基于事件的编程。这是我的全部代码: import turtle turtle.setup
我们在项目中使用Python2.3和wxPython V2.4.2.4。而且运行良好。现在我们将其升级到Python2.7和wxPython2.8.12.1。我们的项目在新版本中编译得很好。但在我们的
我正在尝试创建一个基本的 Tkinter 窗口。 根据在线教程,要创建一个窗口,必须使用以下命令: import Tkinter window=Tkinter.Tk() window.mainloop
我有一个模块使用 python“threading”实现并发,使用“signal”实现关闭 Hook : signal.signal(signal.SIGINT, self.shutdownhook)
我是 Android 世界的新手。跟随和我应该使用哪个在主线程上运行方法之间到底有什么区别? 1) Handler mainHandler = new Handler(getApplicationCo
到现在为止,我曾经用 tk.mainloop() 结束我的 Tkinter 程序,否则什么都不会出现!见例子: from Tkinter import * import random import t
我在我的 Python 应用程序中使用 PyGObject 的 GLib.MainLoop() 并有一个问题。 是否可以处理 loop.run() 中引发的 Python 异常? 例如,我正在使用 G
好吧,我正在编写一个程序,以对应该在循环中显示字母的文本进行动画处理: Th 不过 汤姆 托马 托马斯 托马斯 托马斯苏 托马斯成功... 依此类推,直到重置,然后再次循环。问题是, tkinter
我不熟悉 python,特别是 GUI 问题。我正在尝试添加其他类的图像,我找到了一种添加其他对象但不添加图像的方法。此代码工作正常: from Tkinter import * from PIL i
我正在使用 Python 进行编程,但有几个问题无法在任何地方找到答案(请阅读所有问题,因为它们构成了我的最后一个问题): 1..mainloop() 的作用是什么?我阅读了 Stack Overfl
我是一名优秀的程序员,十分优秀!