Python tkinter GUI中tkraise()引起的位置扰动

Python tkinter GUI中tkraise()引起的位置扰动,python,tkinter,Python,Tkinter,我试图用.csv文件中的给定值绘制一个图表。正如预期的那样,情节似乎没有引起任何问题。问题是画布实际上干扰了前一帧的位置 请注意,我使用了两个具有tkraise功能的帧,其中另一个帧id使用按钮调用,从现在开始显示帧。这种情况发生得很顺利,但位置有点受到干扰。是否有任何方法可以保留帧中数据在第一帧中按要求居中的位置 我想强调的是这个特殊的类数据存储在图的绘图发生的地方 这是我的代码: 将tkinter作为tk导入 从tkinter导入消息框 导入序列号 从serial.tools导入列表\u端口

我试图用.csv文件中的给定值绘制一个图表。正如预期的那样,情节似乎没有引起任何问题。问题是画布实际上干扰了前一帧的位置

请注意,我使用了两个具有tkraise功能的帧,其中另一个帧id使用按钮调用,从现在开始显示帧。这种情况发生得很顺利,但位置有点受到干扰。是否有任何方法可以保留帧中数据在第一帧中按要求居中的位置

我想强调的是这个特殊的类数据存储在图的绘图发生的地方

这是我的代码:

将tkinter作为tk导入
从tkinter导入消息框
导入序列号
从serial.tools导入列表\u端口
从操作系统导入路径
导入连续线程
导入csv
从日期时间导入日期时间
从matplotlib.figure导入图形
从matplotlib.backends.backend_tkagg导入(图CAVASTKAGG,导航工具栏2TK)
字体=(“Helvetica”,20)
属性={'padx':20'pady':20}
th=无
类应用程序(tk.tk):
定义初始化(self,*args,**kwargs):
super()
self.title('DAS'))
自几何体('600x450')
容器=tk.框架(自身)
container.pack(fill=tk.BOTH,expand=True)
self.frames={}
self.frames[0]=显示(容器,self)
self.frames[0]。网格(行=0,列=0,sticky='nsew')
self.frames[1]=数据存储(容器,self)
self.frames[1]。网格(行=0,列=0,sticky='nsew')
self.show_帧(0)
def显示帧(自身,帧):
frame=self.frames[frame]
frame.tkraise()
类显示(tk.Frame):
定义初始化(自身、容器、控制器):
super().\uuuu init\uuuu(容器)
name=tk.Label(self,text='Data acquisition System',font=font)
name.pack(fill='x')
左包装=传统框架(自)
左包装器.pack(side='left',**属性)
右包装=tk.Frame(self)
右包装器.pack(side='left',**属性)
端口标签=tk.label(左包装,text='port:',font=font)
端口标签网格(行=0,列=0)
port\u option=tk.StringVar(左包装,value='None')
ports\u Available=self.get\u arduino\u ports()
port\u value=tk.OptionMenu(左包装,port\u选项,*ports\u可用)
端口值网格(行=0,列=1)
baud_label=tk.label(左包装,text='Baudrate:',font=font)
波特率标签网格(行=1,列=0)
波特值=tk.条目(左包装)
波特率值网格(行=1,列=1)
波特率值。插入(0,9600)
connect\u button=tk.button(左包装,text='connect',command=lambda:self.connect\u到\u端口(port\u option.get(),baud\u value.get())
连接按钮网格(行=2,列=1)
播放按钮=tk.button(左包装,text='playback',command=lambda:controller.show_帧(1))
播放按钮网格(行=3,列=1)
大小={‘高度’:4,‘宽度’:15}
温度\u label=tk.标签(右包装,text='temperature(以摄氏度为单位):',font=font)
self.temperature\u val=tk.Text(右包装,**尺寸)
自我温度值配置(state='disabled')
温度标签网格(行=0,列=0)
自温度值网格(行=0,列=1)
def get_arduino_端口(自身):
"""
返回Arduino连接的端口。如果找到多个端口,则返回第一个端口。
"""
arduino_端口=[
#grep返回与comports相同的端口列表。它还使用regex过滤掉设备。
p、 列表中p的设备\u ports.grep(r'Arduino')
]
如果不是arduino_端口:
返回['None']
返回arduino_端口
def connect_至_端口(自身、端口、波特率=9600):
"""
函数来建立与端口的连接。
"""
全球董事会
全局数据文件
如果不是端口:
一无所获
尝试:
线路板=串行。串行(端口,波特率)
BOARD.flush()
除serial.SerialException外:
打印(“无法连接到板。”)
messagebox.showwarning(“串行错误”,“无法连接到板”)
返回
数据文件=打开(“DATA.csv”、“a”)
数据文件写入(“时间、温度\n”)
全球th
th=连续线程.PeriodicThread(0.5,目标=self.read\u数据)
th.start()
def读取_数据(自身):
"""
从连接的板读取数据。
"""
如果serial.in_waiting>0:
time\u now=datetime.now().strftime(“%H:%M:%S”)
接收=线路板。读取()。解码('utf-8')
DATA_FILE.write(',').join((现在,接收到时间))+'\n')
自身温度值删除(0,tk.END)
自我温度值插入(0,已接收)
类数据存储(tk.Frame):
定义初始化(自身、容器、控制器):
super().\uuuu init\uuuu(容器)
标签(self,text='playbackdata',font=font).pack(fill=tk.X)
顶部框架=传统框架(自身)
顶部框架包装(填充=tk.X)
底部框架=传统框架(自身)
底部框架包装(填充=tk.X)
update=tk.Button(底部帧,text='update',command=lambda:self.update\u回放(顶部帧))
update.pack()
back=tk.Button(底部框架,text='back',command=lambda:controller.show\u框架(0))
back.pack()
def更新_播放(自身、容器):
时间=[]
温度=[]
如果路径不存在(“data.csv”):
messagebox.showwarning(“警告”,“未找到要打印的数据”)
返回
打开(“data.csv”、“r”)作为文件:
reader=csv.reader(文件)
下一位(读者)
对于读取器中的行:
时间现在,温度现在=行[0],行[1]
time.append(time\u now)
te