Tkinter框架对齐(网格布局)

时间:2015-08-07 13:09:11

标签: python tkinter

在Python / Tkinter中,我试图从一个帧中获取一个值(整数),对它进行计算并将其作为输出返回。当只使用主框架并将所有内容放在那一帧中时,我能够使它工作。现在我想将它和另一个操作分成它们自己的帧。

我的程序将板脚转换为Lineal脚(框架A)和 线脚到板脚(框架B)。

我收到的错误如下:NameError: global name 'b_entry' is not defined。我有一种感觉,我可能会做不正确的引用框架(自我,主,a_frame等)。

这是一个简单的例子:

import Tkinter as tk

class App:
    def __init__(self, master):
        self.master = master
        master.grid()

        b_frame = tk.Frame(master).grid(row=0)
        b_name = tk.Label(b_frame, text='Blah').grid(row=1, columnspan=4)
        b_label = tk.Label(b_frame, text='Label').grid(row=2, column=0)
        b_entry = tk.Entry(b_frame).grid(row=2, column=1)
        b_output = tk.Label(b_frame, text='Output')
        b_output.grid(row=3, columnspan=2)
        b_button = tk.IntVar()
        tk.Button(b_frame, text='calc', command=self.convert).grid(row=4, columnspan=2)

    def convert(self):
        a = int(b_entry.get())
        result = int(a * a)
        b_output.configure(text=result)

root = tk.Tk()
App(root)
root.mainloop()

1 个答案:

答案 0 :(得分:1)

我看到两个问题。

  • 您不应将窗口小部件分配给变量,并将其打包/网格化在同一行上。这会导致变量的值为None,因为这是packgrid返回的值。这将搞乱您的窗口小部件层次结构,因为当b_frame为无时,tk.Label(b_frame, ...将使标签成为Tk窗口的子项而不是框架。
  • 如果您希望变量在所有类的方法中可见,则应将其指定为self的属性。

所以你应该改变像

这样的行
b_entry = tk.Entry(b_frame).grid(row = 2, column = 1)

self.b_entry = tk.Entry(b_frame)
self.b_entry.grid(row = 2, column = 1)

然后,您将能够正确引用convert中的条目。

a = int(self.b_entry.get())