简体   繁体   English

Tkinter框架对齐(网格布局)

[英]Tkinter frame alignment (grid layout)

In Python/Tkinter, I am trying to get a value (integer) from a frame, do a calculation on it and return it as an output. 在Python / Tkinter中,我试图从框架中获取一个值(整数),对其进行计算并将其作为输出返回。 I was able to make it work when using only a master frame and putting everything in that one frame. 当仅使用一个主框架并将所有内容放入该框架时,我能够使其工作。 Now I want to separate it and another operation into their own frames. 现在,我想将它和其他操作分离到各自的框架中。

My program converts board feet to Lineal feet (frame A) and Lineal feet to board feet (frame B). 我的程序将木板英尺转换为线性英尺(框架A),并将线性英尺转换为木板英尺(框架B)。

I get errors like: NameError: global name 'b_entry' is not defined . 我收到如下错误: NameError: global name 'b_entry' is not defined I have a feeling I might be doing things like referencing frames (self, master, a_frame, etc.) improperly. 我有一种感觉,我可能在做诸如未正确引用框架(自身,主框架,a_frame等)之类的事情。

Here's a simple example: 这是一个简单的例子:

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

I see two issues. 我看到两个问题。

  • You should not assign a widget to a variable and pack/grid it on the same line. 您不应将窗口小部件分配给变量,而应在同一行上打包/网格化它。 This causes the variable to have a value of None , because that's what pack and grid return. 这将导致变量的值为None ,因为这就是packgrid返回的内容。 This will screw up your widget hierarchy because when b_frame is None, tk.Label(b_frame, ... will make the label a child of the Tk window instead of the Frame. 因为b_frame为None, tk.Label(b_frame, ...将使标签成为Tk窗口而不是Frame的子tk.Label(b_frame, ...这将使小部件层次结构b_frame
  • If you want a variable to be visible in all of a class' methods, you should assign it as an attribute of self . 如果希望变量在类的所有方法中可见,则应将其分配为self的属性。

So you should change lines like 所以你应该改变像

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

To

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

Then you will be able to properly reference the entry in convert . 然后,您将能够正确引用convert的条目。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM