如何使两个Tkinter ttk.Frame小部件具有相同的宽度?

时间:2020-08-08 18:50:00

标签: python tkinter tk ttk

我正在使用Tkinter GUI。我想使两个单独的框架具有相同的宽度,以便它们垂直对齐。我不知道将它们放在相同结构中的任何方法,因为它们需要可以在垂直方向上独立滚动(该功能尚不在代码中)。

我尝试了各种方法,我认为将下部框架的宽度设置为等于上部框架的宽度,因为缺省情况下下部框架的宽度较小,但这似乎没有效果。 查看行

        # Match widths
        self.vert_frames[-1][1].configure(width=self.vert_frames[-1][0].cget("width"))

我对stackoverflow和python都是新手,所以如果您需要更多详细信息或对我的问题格式或其他内容有更正,请告诉我。我已经很久了,所以很高兴听到大家都知道的解决方案!

谢谢大家。

# Imports

import tkinter as tk
from tkinter import ttk

# Define GUI CLASS
class tl_GUI:
    # initialize the GUI
    def __init__(self, root):
        self.root = root
        
        # set geometry
        # self.root.geometry("480x320+150+150") # remove if not used in final version
        self.root.grid_rowconfigure(0, weight=1)
        self.root.grid_columnconfigure(0, weight=1)
        
        # SET STRUCTURE
        # create data_canvas
        self.data_canvas = tk.Canvas(self.root)
        self.data_canvas.grid(row = 0, column = 0, sticky = "nsew")
        
        # create 2-pane PanedWindow
        self.data_panedwindow = ttk.Panedwindow(self.data_canvas, orient="vertical")
        self.data_panedwindow.pack(fill="both", expand=True)
        
        # create input canvas
        self.in_canvas = tk.Canvas(self.data_panedwindow)
        self.data_panedwindow.add(self.in_canvas, weight=1)
        
        # create input frame
        self.in_frame = ttk.Frame(self.in_canvas, relief="sunken")
        self.in_frame.pack()
        
        # create output canvas
        self.out_canvas = tk.Canvas(self.data_panedwindow)
        self.data_panedwindow.add(self.out_canvas, weight=1)
        
        # create output frame
        self.out_frame = ttk.Frame(self.out_canvas, relief="sunken")
        self.out_frame.pack()
        
        # CREATE INITIAL I/O FRAMES
        self.curr_compares = 0
        self.vert_frames = []
        for init_frames in range(0, 2):
            self.add_compareIO()
    
    # define method to add a vertical I/O frame
    def add_compareIO(self):
        # create input and output frames
        self.vert_frames.append([])
        self.vert_frames[-1].append(ttk.Frame(self.in_frame, padding = 2, relief = "groove"))
        self.vert_frames[-1].append(ttk.Frame(self.out_frame, padding = 2, relief = "groove"))
        self.vert_frames[-1][0].grid(row = 0, column = self.curr_compares)
        self.vert_frames[-1][1].grid(row = 0, column = self.curr_compares)
        
        # close_frame
        col = len(self.vert_frames)-1 # may be able to use self.curr_compares instead
        self.vert_frames[-1][0].button_close = ttk.Label(self.vert_frames[-1][0], 
                                                          text="[Image here]")
        self.vert_frames[-1][0].button_close.grid(row = 0, column = 0, columnspan=2, stick = "e")
        self.vert_frames[-1][0].button_close.bind("<Button-1>", 
                                          lambda e: self.destroy_frame(col_num=col))
        self.vert_frames[-1][1].button_close = ttk.Label(self.vert_frames[-1][1], 
                                                          text="[Image here]")
        self.vert_frames[-1][1].button_close.grid(row = 0, column = 0, columnspan=2, stick = "e")
        self.vert_frames[-1][1].button_close.bind("<Button-1>", 
                                          lambda e: self.destroy_frame(col_num=col))
        
        # populate inputs
        self.vert_frames[-1][0].label_hpp = ttk.Label(self.vert_frames[-1][0], text = "INPUT1")
        self.vert_frames[-1][0].entry_hpp = ttk.Entry(self.vert_frames[-1][0], width = 13)
        self.vert_frames[-1][0].entry_hpp.bind("<KeyRelease>", lambda e: self.refresh_calculations(col)) # recalculate when any keyboard button is pressed
            
        self.vert_frames[-1][0].label_int_rate = ttk.Label(self.vert_frames[-1][0], text = "INPUT2")
        self.vert_frames[-1][0].entry_int_rate = ttk.Entry(self.vert_frames[-1][0], width = 13)
        self.vert_frames[-1][0].entry_int_rate.bind("<KeyRelease>", lambda e: self.refresh_calculations(col))
        
        self.vert_frames[-1][0].label_RENAME = ttk.Label(self.vert_frames[-1][0], text = "INPUT3")
        self.vert_frames[-1][0].entry_RENAME = ttk.Entry(self.vert_frames[-1][0], width = 13)
        self.vert_frames[-1][0].entry_RENAME.bind("<KeyRelease>", lambda e: self.refresh_calculations(col))
            
        self.vert_frames[-1][0].label_hpp.grid(row = 1, column = 0)
        self.vert_frames[-1][0].entry_hpp.grid(row = 1, column = 1)
        self.vert_frames[-1][0].label_int_rate.grid(row = 2, column = 0)
        self.vert_frames[-1][0].entry_int_rate.grid(row = 2, column = 1)
        self.vert_frames[-1][0].label_RENAME.grid(row = 3, column = 0)
        self.vert_frames[-1][0].entry_RENAME.grid(row = 3, column = 1)
        
        # populate outputs
        self.vert_frames[-1][1].label_tcl = ttk.Label(self.vert_frames[-1][1], text = "OUTPUT1: {}".format(10))
        
        self.vert_frames[-1][1].label_tcl.grid(row = 1, column = 0)
        
        # Match widths
        self.vert_frames[-1][1].configure(width=self.vert_frames[-1][0].cget("width"))
        
        # update counter
        self.curr_compares += 1
        
    def destroy_frame(self, col_num):
        self.vert_frames[col_num][0].grid_forget()
        self.vert_frames[col_num][1].grid_forget()
        self.vert_frames[col_num][0].destroy()
        self.vert_frames[col_num][1].destroy()
        self.vert_frames[col_num] = []
        
    
    # define method to refresh calculations (wrapper for actual calcs)
    def refresh_calculations(self, col):
        pass
    
    
# Execute code
if __name__ == "__main__":
    root = tk.Tk()
    my_gui = tl_GUI(root)
    root.mainloop()

0 个答案:

没有答案