【问题标题】:TTK, Buttons only have one number on themTTK,按钮上只有一个数字
【发布时间】:2016-08-16 14:42:00
【问题描述】:
import tkinter
from tkinter import ttk

def main():
    root = tkinter.Tk()
    numpad = NumPad(root)
    root.mainloop()

numbers = [
'7',  '8',  '9',
'4',  '5',  '6',
'1',  '2',  '3']


class NumPad(ttk.Frame):
    def __init__(self, root):
        ttk.Frame.__init__(self, root)
        self.grid()
        self.num()

    def num(self):
        for c in range(1,4):
            for r in range(3):
                for b in numbers:
                    cmd = lambda b=b: print(b)
                    self.b= ttk.Button(self, text=b, command=cmd).grid(row = r, column = c, pady = 5)
                    #print(b)

main()

我遇到了这段代码的问题,因为当我尝试运行它时,所有按钮上只有 3 个,唯一的输出是 3。我试着查看我做错了什么,但仍然无法找出错误。它只选择“数字”函数中的最后一个数字。

感谢任何帮助。

【问题讨论】:

    标签: python python-3.x tkinter ttk


    【解决方案1】:

    对于网格上的每个位置,您将创建 9 个按钮并将一个放在另一个之上。只有最后一个按钮(对应于 3 的那个)最终会出现,并且每次都会出现。相反,您需要根据cr 找出索引并且只创建1个按钮:

    def num(self):
        for c in range(1,4):
            for r in range(3):
                b = (c - 1) * 3 + r
                cmd = lambda b=b: print(b)
                self.b= ttk.Button(self, text=b, command=cmd).grid(row = r, column = c, pady = 5)
                #print(b)
    

    【讨论】:

    • 谢谢!我设法通过这样做来解决这个问题 #print(b) c += 1 if c > 2: c = 0 r += 1'
    【解决方案2】:

    您在最后一个内部循环中覆盖了self.b。试试这个:

    import tkinter
    from tkinter import ttk
    
    def main():
        root = tkinter.Tk()
        numpad = NumPad(root)
        root.mainloop()
    
    numbers = [
    '7',  '8',  '9',
    '4',  '5',  '6',
    '1',  '2',  '3']
    
    
    class NumPad(ttk.Frame):
        def __init__(self, root):
            ttk.Frame.__init__(self, root)
            self.grid()
            self.num()
    
        def num(self):
            for c in range(3):
                for r in range(3):
                    text = numbers[c*3+r]
                    cmd = lambda text=text: print(text)
                    self.b= ttk.Button(self, text=text, command=cmd).grid(row = r, column = c, pady = 5)
    
    main()
    

    【讨论】:

    • 我知道现在情况如何。唯一的区别是数字先垂直,然后水平。我可以通过改变顺序来解决这个问题。
    • 正确。我没有注意到。
    【解决方案3】:

    使用zip 将每个行列坐标与numbers 中的一项配对:

    def num(self):
        rc_gen = ((r, c) for r in range(3) for c in range(3))
        for (r, c), num in zip(rc_gen, numbers):
            cmd = lambda num=num: print(num)
            self.b = ttk.Button(self, text=num, command=cmd).grid(row=r, column=c, pady=5)
    

    【讨论】:

    • 像魅力一样工作!谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    相关资源
    最近更新 更多