直到现在,我曾经用以下结束我的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) 我已经找这个很久了。在 tkinter 中获取 Canvas 的高度/宽度有这么难吗?我想做这样的事情:
c = Tk.Canvas(self, heigth=12, width=12)
c.create_oval(0, 0, self.height, self.width)
Run Code Online (Sandbox Code Playgroud)
这样我就可以用画布的宽度/高度的周长画一个圆。
为什么我找不到画布的宽度/高度等任何属性?
c.winfo_width并且c.winfo_height不起作用,因为这只会给我带来错误。
你能帮助我吗?这真的很烦人,因为即使在构造函数中也有属性height和width......
我是Tkinter的新手,所以如果这很容易我道歉,但我已经搜索了几个小时而无法弄明白.我想要做的是在mainloop空闲之后,我总是想调用函数checkForGroupUpdates().当我运行下面的代码时,它只运行一次.我不知道每次主循环空闲时它都会运行.我很感激帮助.
from Tkinter import *
import random
class Network(Frame):
""" Implements a stop watch frame widget. """
def __init__(self, parent=None, **kw):
Frame.__init__(self, parent, kw)
self.makeWidgets()
def makeWidgets(self):
""" Make the time label. """
self._canvas = Canvas(self, width=600, height=400)
self._canvas.pack()
def checkForGroupUpdates(self):
print "checking"
h=0
this=10
while this>.0001:
this=random.random()
print h
h=h+1
print "checked"
def main():
root = Tk()
nw = Network(root)
nw.pack(side=TOP)
root.after_idle(nw.checkForGroupUpdates)
root.mainloop()
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud) 假设我们有三个 tkinter 小部件:一个标签、一个树视图和一个选项菜单(下面将简称为“菜单”)。一旦选择了一个选项,我就成功地使菜单执行了一个功能。简短的函数如下所示:
def data_process():
# do something takes time
def print_data()
data_process() # do something takes time too
# print stuff to treeview
def refresh_table(self, args):
label['text'] = 'Executing' # change label text to Executing
print_data() # a func. which takes time to run
label['text'] = 'Done' # change text to Done
label = tk.Label(parent, text = 'ready')
label.pack()
menu = tk.OptionMenu(parent, var, *list, command = lambda _:refresh_table(self, args))
menu.pack()
table = tk.Treeview(parent)
table.pack()
Run Code Online (Sandbox Code Playgroud)
函数print_data将向树视图小部件(表)打印一些内容。标签小部件就像一个状态栏,告诉用户现在发生了什么。所以我尝试做的工作流程是:
在菜单中选择一个选项并调用refresh_table …