Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用tkraise显示两帧时的tkinter问题_Python_Tkinter - Fatal编程技术网

Python 用tkraise显示两帧时的tkinter问题

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

我试图以这样的方式显示两个帧,一个帧有一个按钮来显示另一个帧,反之亦然。我试图使用tkraise()的tkinter框架函数。但它们同时被展示在彼此身上。请您可以忽略导入板文件,因为它有一些助手函数,我正在使用这些函数在GUI上显示一些数据

这是我的密码:

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