tkinter按钮释放事件与网格

时间:2017-03-20 16:33:05

标签: python user-interface tkinter

所以我试图创建一个python GUI来控制四个按钮。 GUI按钮由.grid()对齐。我希望能够按下一个按钮,移动电机直到我松开它。我找到了适用于按下和发布事件的示例,但后来我无法使GUI看起来与下面的代码相同

from tkinter import *
from tkinter import ttk

def up(event):
    print("up")
def down(event):
    print("down")   
def left(event):
    print("left")
def right(event):
    print("right")
def stopV(event):
    print("stopV")
def stopH(event):
    print("stopH")

root = Tk()
root.title("Telescope Controller")

mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)

Bup = ttk.Button(mainframe, text="Up").grid(column=2, row=1, sticky=(W, E))
#Bup.bind("<ButtonPress>",up)
#Bup.bind("<ButtonRelease>",stopV)
Bdwn = ttk.Button(mainframe, text="Down").grid(column=2, row=3, sticky=W)
#Bdwn.bind("<ButtonPress>",down)
#Bdwn.bind("<ButtonRelease>",stopV)
Bl = ttk.Button(mainframe, text="Left").grid(column=1, row=2, sticky=E)
#Bl.bind("<ButtonPress>",left)
#Bl.bind("<ButtonRelease>",stopH)
Br = ttk.Button(mainframe, text="Right").grid(column=3, row=2, sticky=W)
#Br.bind("<ButtonPress>",right)
#Br.bind("<ButtonRelease>",stopH)

for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=5)

root.mainloop()

当我编写这样的代码时,.bind()不起作用并输出

AttributeError:&#39; NoneType&#39;对象没有属性&#39; bind&#39;

当我使用适用于按钮按下和释放事件的示例时,我无法使用.grid()代替.pack()。我不知道如何使用.pack()将按钮对齐,所以我想知道是否有一种简单的方法可以将按钮按下并释放事件添加到上面的代码中。

谢谢

2 个答案:

答案 0 :(得分:1)

这是一个常见的初学者问题。虽然它在示例中使用了很多,但您不能将布局(网格在您的情况下)放在与初始化相同的行上。你的所有按钮都必须是这样的:

Br = ttk.Button(mainframe, text="Right")
Br.grid(column=3, row=2, sticky=W)

答案 1 :(得分:0)

没关系哇,这是一个简单的修复....对于任何有类似问题的人来说,这里有更新的工作代码:

from tkinter import *
from tkinter import ttk

def up(event):
    print("up")
def down(event):    
    print("down")   
def left(event):
    print("left")
def right(event):
    print("right")
def stopV(event):
    print("stopV")
def stopH(event):
    print("stopH")

root = Tk()
root.title("Telescope Controller")

mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)

Bup = ttk.Button(mainframe, text="Up")
Bup.grid(column=2, row=1, sticky=(W, E))
Bup.bind("<ButtonPress>",up)
Bup.bind("<ButtonRelease>",stopV)
Bdwn = ttk.Button(mainframe, text="Down")
Bdwn.grid(column=2, row=3, sticky=W)
Bdwn.bind("<ButtonPress>",down)
Bdwn.bind("<ButtonRelease>",stopV)
Bl = ttk.Button(mainframe, text="Left")
Bl.grid(column=1, row=2, sticky=E)
Bl.bind("<ButtonPress>",left)
Bl.bind("<ButtonRelease>",stopH)
Br = ttk.Button(mainframe, text="Right")
Br.grid(column=3, row=2, sticky=W)
Br.bind("<ButtonPress>",right)
Br.bind("<ButtonRelease>",stopH)

for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=5)

root.mainloop()