【问题标题】:tkinter button release events with grid带有网格的 tkinter 按钮释放事件
【发布时间】:2017-03-20 16:33:04
【问题描述】:

所以我正在尝试创建一个 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: 'NoneType' 对象没有属性 'bind'

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

谢谢

【问题讨论】:

    标签: python user-interface tkinter


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      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()
      

      【讨论】:

      • 如果您要回答自己的问题,请写下您所做更改的说明,重新发布您的代码不会帮助任何位未来的读者。
      猜你喜欢
      • 2015-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-09
      • 1970-01-01
      • 2020-10-26
      • 2015-02-15
      • 1970-01-01
      相关资源
      最近更新 更多