Tkinter,一次做多个帧,每个帧都有按钮。但按钮会忽略它们所给出的帧,只使用网格

时间:2016-03-30 21:29:51

标签: python user-interface tkinter

我正在写一个Tkinter程序,我可以制作多个帧,我可以选择它们相对于彼此的位置,所以我决定使用grid()来决定哪个帧在哪里。我还有一个类AppButton,它创建一个按钮/标签/条目。我试图传递我想要创建按钮的框架,并使用网格来确定它相对于它创建的框架的位置。

目前,按钮不会在我尝试传递的帧中生成,而是使用与帧相同的网格,只是放在那里,回头看起来很有意义。

我的问题是,如何更改此选项,以便按钮的网格是一个单独的网格,仅相对于它创建的框架?这样,如果我移动框架,按钮也会,但它们在框架中的相对位置保持不变。

现在框架和按钮共享相同的网格,这就是他们的位置确定的方式。

import Tkinter as tk
import tkFileDialog as tkfd

class AppButton:
    #simple button construction
    #create a button with chosen arguments
    def create_button(self, words, rownum, frame):
        btn = tk.Button(frame, text = words)
        btn.grid(row = rownum, column = 2)

    def create_entry(self, rownum, frame):
        txt = tk.Entry(frame)
        txt.grid(row = rownum, column = 1)

    def create_label(self, words, rownum, frame):
        lbl = tk.Label(frame, text = words)
        lbl.grid(row = rownum, column = 0)

    #input is composed of a Label, an Entry, and a Button. calls the three funcs above
    def create_input(self, words, rownum, frame):
        self.create_label(words, rownum, frame)
        self.create_entry(rownum, frame)
        self.create_button("OK", rownum, frame)

class Application(tk.Frame):
    """A GUI application that creates multiple buttons"""

    #create a class variable from the root(master) called by the constructor
    def __init__(self, master):
        self.master = master
        master.title("The best GUI")
        tk.Frame.__init__(self, master, width=200, height=200)
        self.grid(row = 0, column = 0)

    def new_frame(self, master, color, row, column):
        frame = tk.Frame(master, width=200, height=200, bg=color)
        frame.grid(row = row, column = column)
        return frame


if __name__ == "__main__":
    root = tk.Tk()
    root.title("Button Test Launch")
    app = Application(root)
    appbutton = AppButton()
    frame1 = app.new_frame(root, "red", 3, 1)
    frame2 = app.new_frame(root, "blue", 2, 2)
    appbutton.create_input("test1", 0, root)
    appbutton.create_input("test2", 1, root)
    appbutton.create_input("test3", 2, root)
    appbutton.create_input("test4", 3, root)
    root.mainloop()

以下是现在的样子: Current GUI

我希望的最终结果是例如" test1 ______ [OK]"完全属于这些框架中的一个。

1 个答案:

答案 0 :(得分:1)

您告诉按钮使用method作为其父级。相反,你应该传递框架:

root