Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 特金特';Tk().after()';方法导致gui无法启动_Python_Python 3.x_Tkinter - Fatal编程技术网

Python 特金特';Tk().after()';方法导致gui无法启动

Python 特金特';Tk().after()';方法导致gui无法启动,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我试图每秒钟在一个文本框中发送一条文本。关于如何使用Tk()。比如这个例子 root = Tk() def foo(): print(repeat) root.after(5000, foo()) foo() root.mainloop() 但是,尝试此解决方案时,主窗口从未出现。它也不会异常退出。我唯一能想到的是,在到达mainloop调用之前,我正在进入一个无限循环 这是我的代码的浓缩版本 def vp_start_gui(): global val, w, ro

我试图每秒钟在一个文本框中发送一条文本。关于如何使用
Tk()。比如这个例子

root = Tk()
def foo():
    print(repeat)
    root.after(5000, foo())

foo()
root.mainloop()
但是,尝试此解决方案时,主窗口从未出现。它也不会异常退出。我唯一能想到的是,在到达
mainloop
调用之前,我正在进入一个无限循环

这是我的代码的浓缩版本

def vp_start_gui():
    global val, w, root
    root = Tk()
    top = MainWindow (root)
    init(root, top)
    root.mainloop()

class MainWindow():
    def __init__():
        self.widgets

def init(top, gui, *args, **kwargs):
    global w, top_level, root
    w = gui
    top_level = top
    root = top
    root.after(15000,updateLoans(w, root))

def updateLoans(w, rt):
    w.LoanOfferView.insert(END, viewModel.loanOffers())
    w.LoanDemandView.insert(END, viewModel.loanDemands())
    rt.after(15000,updateLoans(rt))

vp_start_gui()
viewModel
是第三个模块,它从API中提取非常少量的数据`LoanDemands是一个滚动文本小部件

有人知道会出什么问题吗

蟒蛇3.4
使用“页面”gui设计器开发tkinter UI

在进入无限循环之前,程序需要等待一些东西。试试这个:

Button(root, text='start', command=foo).pack()
也请更换您的线路:

foo()
此外,在将函数传递给其他函数时,不应使用括号:

root.after(5000, foo)

所以我自己找到了这个问题的答案

编写不起作用的示例

root = Tk()
def foo():
    print(repeat)
    root.after(5000, foo())

foo()
root.mainloop()
对我有用的代码

root = Tk()
def foo():
    print(repeat)
    root.after(5000, foo)

foo()
root.mainloop()
在仔细阅读了我在底部引用的关于effbot的tkinter文档之后。我意识到函数名正在被引用,但函数本身实际上并没有在
after()
方法中被调用

注册在给定时间后调用的报警回调

此方法注册一个回调函数,该函数将在 给定的毫秒数。Tkinter仅保证 回调不会在此之前调用;如果系统忙, 实际的延迟可能要长得多

对该方法的每次调用只调用一次回调。保存 调用回调时,需要在内部重新注册回调 本身:

类应用程序: definit(自身、主控): self.master=master self.poll()#开始轮询

def poll(self):
    ... do something ...
    self.master.after(100, self.poll)

(1) 不要调用
foo()
,(2)您可能会发现阅读一些关于python类和
self的使用的信息很有用。
您是正确的:您正在进入一个无限循环,因为您在
之后调用
,错误。这个答案的后一部分是正确的。这样做的目的是持续自动地更新某些内容。将命令放在函数中会破坏purpose@RileyHugh只需单击按钮一次即可触发无限循环。你可以在
foo
开始时销毁它(在一些丑陋的事情之后,确保你只做一次)。您的方法每5秒打印一次
重复