相关疑难解决方法(0)

你如何在Tkinter的事件循环中运行自己的代码?

我的小弟弟正在进入编程,而在他的科学博览会项目中,他正在模拟天空中的一群鸟.他已经完成了大部分代码编写工作,并且工作得很好,但是鸟类需要每时每刻都在移动.

然而,Tkinter占用了自己的事件循环的时间,所以他的代码不会运行.做root.mainloop()运行,运行和继续运行,它运行的唯一事情是事件处理程序.

有没有办法让他的代码与mainloop一起运行(没有多线程,这很混乱,这应该保持简单),如果是这样,它是什么?

现在,他想出了一个丑陋的黑客,把他的move()功能绑在一起<b1-motion>,所以只要他按住按钮并摆动鼠标,就可以了.但必须有一个更好的方法.

python events tkinter

110
推荐指数
4
解决办法
13万
查看次数

Tkinter了解mainloop

直到现在,我曾经用以下结束我的Tkiter程序:tk.mainloop()或者什么都不会出现!见例子:

from Tkinter import *
import random
import time

tk = Tk()
tk.title = "Game"
tk.resizable(0,0)
tk.wm_attributes("-topmost", 1)

canvas = Canvas(tk, width=500, height=400, bd=0, highlightthickness=0)
canvas.pack()

class Ball:
    def __init__(self, canvas, color):
        self.canvas = canvas
        self.id = canvas.create_oval(10, 10, 25, 25, fill=color)
        self.canvas.move(self.id, 245, 100)
    def draw(self):
        pass

ball = Ball(canvas, "red")

tk.mainloop()
Run Code Online (Sandbox Code Playgroud)

然而,当尝试下这个程序的下一步(让球随时间移动)时,本书正在阅读,说要做到以下几点.将绘图功能更改为:

def draw(self):
    self.canvas.move(self.id, 0, -1)
Run Code Online (Sandbox Code Playgroud)

并将以下代码添加到我的程序:

while 1:
    ball.draw()
    tk.update_idletasks()
    tk.update()
    time.sleep(0.01)
Run Code Online (Sandbox Code Playgroud)

但我注意到添加这段代码,使用tk.mainloop()无用,因为即使没有它,一切都会出现!

在这一刻,我应该提到我的书从未谈到tk.mainloop()(也许是因为它使用Python 3)但我学会了它在网上搜索,因为我的程序不能通过复制书的代码工作!

所以我尝试做以下不起作用!

while 1:
    ball.draw()
    tk.mainloop() …
Run Code Online (Sandbox Code Playgroud)

python tkinter

49
推荐指数
2
解决办法
12万
查看次数

Tkinter窗口说(没有响应)但代码正在运行

单击操作按钮后,我有一个程序运行一个很长的过程.当进程正在运行时,根窗口会说它没有响应,即使我知道程序在后台运行.这个程序将发布给我工作的一些人,我想确保他们看到这个时不会惊慌失措并关闭窗口.我的解决方案是将root.update放在正在运行的进程的循环中,但我不确定这是最好的修复.

使用python 3.3

下面是代码示例,以便您了解我正在做什么,这是从主循环中调用的:

def combine(boxes_to, boxes_from, frame):
        to_value,to_pos = gui.checkBoxes(boxes_to)
        from_value,from_pos = gui.checkBoxes(boxes_from)
        frame.destroy()

        running = Label(root,text="Running please do not close..",font = (16))
        running.pack()
        root.update()
        map_to = open("map_to",'r')
        for line in map_to:
            root.update()
            process(line)


        running.destroy()
        map_to.close()
        finish = Button(root, text="Done",command=gui.stop)
        finish.pack()
Run Code Online (Sandbox Code Playgroud)

python user-interface tkinter python-3.x

7
推荐指数
2
解决办法
9557
查看次数

标签 统计

python ×3

tkinter ×3

events ×1

python-3.x ×1

user-interface ×1