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

Python 如何使两个Tkinter ttk.Frame小部件具有相同的宽度?,python,tkinter,tk,ttk,Python,Tkinter,Tk,Ttk,我正在开发Tkinter GUI。我想让两个单独的框架具有相同的宽度,以便它们垂直排列。我不知道有什么方法可以将它们放在同一个结构中,因为它们需要在垂直方向上独立滚动(该功能尚未在代码中) 我尝试了各种方法,将下框宽度设置为上框宽度,因为默认情况下下下框的宽度较小,但这似乎没有效果。 看台词 # Match widths self.vert_frames[-1][1].configure(width=self.vert_frames[-1][0].cget(&qu

我正在开发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()
#导入
将tkinter作为tk导入
从tkinter导入ttk
#定义GUI类
类tl_GUI:
#初始化GUI
定义初始化(自,根):
self.root=根
#设置几何图形
#self.root.geometry(“480x320+150+150”)#如果未在最终版本中使用,请删除
self.root.grid_rowconfigure(0,权重=1)
self.root.grid\u columnconfigure(0,权重=1)
#集合结构
#在画布上创建数据
self.data\u canvas=tk.canvas(self.root)
self.data\u canvas.grid(行=0,列=0,sticky=“nsew”)
#创建双窗格窗格窗口
self.data\u panedwindow=ttk.panedwindow(self.data\u canvas,orient=“vertical”)
self.data\u panedwindow.pack(fill=“both”,expand=True)
#创建输入画布
self.in\u canvas=tk.canvas(self.data\u panedwindow)
self.data\u panedwindow.add(self.in\u canvas,weight=1)
#创建输入帧
self.in_frame=ttk.frame(self.in_canvas,relief=“sunken”)
self.in_frame.pack()
#创建输出画布
self.out\u canvas=tk.canvas(self.data\u panedwindow)
self.data\u panedwindow.add(self.out\u canvas,weight=1)
#创建输出帧
self.out\u frame=ttk.frame(self.out\u画布,relief=“凹陷”)
self.out_frame.pack()
#创建初始I/O帧
self.curr\u=0
self.vert_frames=[]
对于范围(0,2)内的初始帧:
self.add_compareIO()
#定义方法以添加垂直I/O帧
def添加_比较(自身):
#创建输入和输出帧
self.vert\u frames.append([])
self.vert\u frames[-1]。追加(ttk.frames(self.in\u frames,padding=2,relief=“groove”))
self.vert\u frames[-1]。追加(ttk.frames(self.out\u frames,padding=2,relief=“groove”))
self.vert\u框架[-1][0]。网格(行=0,列=self.curr\u)
self.vert\u框架[-1][1]。网格(行=0,列=self.curr\u)
#闭合框架
col=len(self.vert_frames)-1#可以使用self.curr_来代替
self.vert\u frames[-1][0]。按钮关闭=ttk.Label(self.vert\u frames[-1][0],
text=“[Image here]”)
self.vert\u框架[-1][0]。按钮\u关闭.grid(行=0,列=0,列span=2,stick=“e”)
self.vert\u帧[-1][0]。按钮\u关闭。绑定(“,
lambda e:self.destroy\u帧(col\u num=col))
self.vert\u frames[-1][1]。按钮关闭=ttk.Label(self.vert\u frames[-1][1],
text=“[Image here]”)
self.vert\u frames[-1][1]。按钮\u关闭.grid(行=0,列=0,列span=2,stick=“e”)
self.vert\u frames[-1][1]。按钮\u close.bind(“,
lambda e:self.destroy\u帧(col\u num=col))
#填充输入
self.vert\u框架[-1][0]。label\u hpp=ttk.label(self.vert\u框架[-1][0],text=“INPUT1”)
self.vert_框架[-1][0]。entry_hpp=ttk.entry(self.vert_框架[-1][0],宽度=13)
self.vert_frames[-1][0]。输入_hpp.bind(“,lambda e:self.refresh_calculations(col))#在按下任何键盘按钮时重新计算
self.vert\u帧[-1][0]。label\u int\u rate=ttk.label(self.vert\u帧[-1][0],text=“INPUT2”)
self.vert\u帧[-1][0]。entry\u int\u rate=ttk.entry(self.vert\u帧[-1][0],宽度=13)
self.vert_frames[-1][0]。entry_int_rate.bind(“,lambda e:self.refresh_calculations(col))
self.vert\u frames[-1][0]。label\u RENAME=ttk.label(self.vert\u 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]。条目_RENAME.bind(“,lambda e:self.refresh_计算(col))
self.vert\u frames[-1][0]。标签\u hpp.grid(行=1,列=0)
self.vert\u frames[-1][0].entry\u hpp.grid(行=1,列=1)
self.vert\u frames[-1][0]。label\u int\u rate.grid(行=2,列=0)
self.vert\u frames[-1][0]。entry\u int\u rate.grid(行=2,列=1)
self.vert\u frames[-1][0]。标签\u RENAME.grid(行=3,列=0)
self.vert\u frames[-1][0]。条目\u RENAME.grid(行=3,列=1)
#填充输出
self.vert_frames[-1][1]。label_tcl=ttk.label(self.vert_frames[-1][1],text=“OUTPUT1:{}”。格式(10))
self.vert\u frames[-1][1]。标签\u tcl.grid(行=1,列=0)
#匹配宽度
self.vert_frames[-1][1]。配置(宽度=self.vert_frames[-1][0]。cget(“宽度”))
#更新计数器
self.curr\u比较+=1
def销毁帧(自身、列数):
self.vert\u frames[col\u num][0].grid\u-forget()
self.vert\u frames[col\u num][1].grid\u-forget()
self.vert\u frames[col\u num][0].destroy()
self.vert\u frames[col\u num][1].destroy()
self.vert_帧[col_num]=[]
#定义刷新计算的方法(实际计算的包装器)
def刷新