Python 用tkraise显示两帧时的tkinter问题
我试图以这样的方式显示两个帧,一个帧有一个按钮来显示另一个帧,反之亦然。我试图使用tkraise()的tkinter框架函数。但它们同时被展示在彼此身上。请您可以忽略导入板文件,因为它有一些助手函数,我正在使用这些函数在GUI上显示一些数据 这是我的密码:Python 用tkraise显示两帧时的tkinter问题,python,tkinter,Python,Tkinter,我试图以这样的方式显示两个帧,一个帧有一个按钮来显示另一个帧,反之亦然。我试图使用tkraise()的tkinter框架函数。但它们同时被展示在彼此身上。请您可以忽略导入板文件,因为它有一些助手函数,我正在使用这些函数在GUI上显示一些数据 这是我的密码: import tkinter as tk import tkinter.scrolledtext as st from board import * FONT = ("Helvetica", 20) attributes
import tkinter as tk
import tkinter.scrolledtext as st
from board import *
FONT = ("Helvetica", 20)
attributes = {'padx': 5, 'pady': 5}
class App(tk.Tk):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.title('DAS')
self.geometry('500x325')
container = tk.Frame(self)
container.pack(fill=tk.BOTH, expand=True)
self.frames = {}
self.frames[0] = Display(container, self)
self.frames[0].grid(row=0, column=0)
self.frames[1] = DataStored(container, self)
self.frames[1].grid(row=0, column=0)
self.show_frame(1)
def show_frame(self, frame):
frame = self.frames[frame]
frame.tkraise()
class Display(tk.Frame):
def __init__(self, container, controller):
super().__init__(container)
name = tk.Label(self, text='Data Acquistion System', font=FONT)
name.pack(fill='x')
left_wrapper = tk.Frame(self)
left_wrapper.pack(side='left')
right_wrapper = tk.Frame(self)
right_wrapper.pack(side='left')
port_label = tk.Label(left_wrapper, text='Port:', font=FONT)
port_label.grid(row=0, column=0)
port_option = tk.StringVar(left_wrapper, value='None')
ports_availiable = get_arduino_ports()
port_value = tk.OptionMenu(left_wrapper, port_option, *ports_availiable)
port_value.grid(row=0, column=1)
baud_label = tk.Label(left_wrapper, text='Baudrate:', font=FONT)
baud_label.grid(row=1, column=0)
baud_value = tk.Entry(left_wrapper)
baud_value.grid(row=1, column=1)
baud_value.insert(0, 9600)
connect_button = tk.Button(left_wrapper, text='Connect', command=lambda: connect_to_port(port_option.get(), baud_value.get()))
connect_button.grid(row=2, column=1)
playback_button = tk.Button(left_wrapper, text='Playback', command=lambda: controller.show_frame(1))
playback_button.grid(row=3, column=1)
data_display = st.ScrolledText(right_wrapper)
data_display.pack()
class DataStored(tk.Frame):
def __init__(self, container, controller):
super().__init__(container)
tk.Label(self, text='Playback Data').pack(fill=tk.X)
top_frame = tk.Frame(self)
top_frame.pack(fill=tk.X)
bottom_frame = tk.Frame(self)
bottom_frame.pack(fill=tk.X)
canvas = st.ScrolledText(top_frame)
canvas.pack()
update = tk.Button(bottom_frame, text='Update', command=self.update_playback)
update.grid(row=0, column=0)
back = tk.Button(bottom_frame, text='Back', command=lambda: controller.show_frame(0))
back.grid(row=0, column=1)
def update_playback(self):
with open("data.txt", "r") as file:
data = file.read()
self.data.insert(tk.END, data)
self.data.config(state="disabled")
if __name__ == "__main__":
window = App()
window.mainloop()
有一个简单的解决方案,可以通过更改使用
show\u frame
功能的方式:
def show_frame(self,frame_num):
对于self.frames.values()中的帧:
frame.grid_remove()
frame=self.frames[frame\u num]
frame.grid()
tkraise
不起作用的原因是,您的两个框架的大小不同,如果它们的高度相同,您的代码就完全正确。因为它们的尺寸不同,所以当你看到较小的框架时,你仍然可以看到较大的框架
grid\u remove
从窗口中删除加载的帧,然后下面的grid
命令将帧放回原来的位置,消除重叠等问题。有一个简单的解决方案,通过更改使用显示帧
功能的方式:
def show_frame(self,frame_num):
对于self.frames.values()中的帧:
frame.grid_remove()
frame=self.frames[frame\u num]
frame.grid()
tkraise
不起作用的原因是,您的两个框架的大小不同,如果它们的高度相同,您的代码就完全正确。因为它们的尺寸不同,所以当你看到较小的框架时,你仍然可以看到较大的框架
grid\u remove
从窗口中删除加载的帧,然后下面的grid
命令将帧放回原来的位置,以消除重叠等问题。由于两个帧的大小不同,您需要在grid(…)中添加sticky=“nsew”
要使两个框架占用可用空间,请执行以下操作:
self.frames[0] = Display(container, self)
self.frames[0].grid(row=0, column=0, sticky="nsew")
self.frames[1] = DataStored(container, self)
self.frames[1].grid(row=0, column=0, sticky="nsew")
由于两个框架的大小不同,您需要在
.grid(…)
中添加sticky=“nsew”
,以使两个框架占用可用空间:
self.frames[0] = Display(container, self)
self.frames[0].grid(row=0, column=0, sticky="nsew")
self.frames[1] = DataStored(container, self)
self.frames[1].grid(row=0, column=0, sticky="nsew")