【发布时间】:2021-04-14 17:16:56
【问题描述】:
我想在 tkinter GUI 的两个页面上有两个实时图,并带有按钮来停止实时更新。到目前为止,我已经设法在我的第一页中创建了一个现场图。但是,我在其他函数中创建线程时遇到问题。
api = csb.SeaBreezeAPI()
devices = list_devices() #to get the serial number of the device
spec = sb.Spectrometer.from_serial_number("FLMS15412")
xs = spec.wavelengths()
ys = spec.intensities()
fig1 = Figure(figsize=(10,6),tight_layout=True)
ax1 = fig1.add_subplot(111)
root = tk.Tk()
root.configure(background = 'light blue')
root.geometry("1400x800")
canvas1=FigureCanvasTkAgg(fig1,master=root)
canvas1.get_tk_widget().place(x=5,y=55)
cond = False
def starts():
root.after(1,starts)
cond = False
def plot_data():
if (cond == True):
ax1.cla()
ax1.plot(spec.wavelengths(),spec.intensities
(correct_dark_counts=True),'w',linewidth=1.0)
ax1.set_xlabel('Wavelength (nm)')
ax1.set_ylabel('Intensity (a.u.)')
ax1.set_xlim(200,1000)
ax1.set_ylim(0,60000)
ax1.set_facecolor('#1B1B2A')
ax1.grid(color='w',linestyle='--',linewidth=0.2)
canvas1.draw()
root.after(1,plot_data)
def plot_start():
global cond
cond = True
def plot_stop():
global cond
cond = False
root.update()
startplot = tk.Button(root, text = "Start", font = ('calibri', 12), command = lambda: plot_start())
startplot.place(x=5,y=25)
root.update()
stopplot = tk.Button(root, text = "Stop", font = ('calibri', 12), command = lambda: plot_stop())
stopplot.place(x=65,y=25)
root.update()
start = tk.Button(root, text = "Stage", font = ('calibri', 12),
command=threading.Thread(target=plot_data).start())
start.place(x=125,y=25)
threading.Thread(target=plot_data).start()
root.after(1,plot_data)
root.mainloop()
这是单个页面中实时绘图的最小代码。我想用另一个实况图创建另一个页面。我怎么能用 tkinter 做到这一点。任何帮助将不胜感激。
【问题讨论】:
-
您可以使用 TopLevel 并且几乎可以复制代码吗?
-
如果我使用TopLevel,它不是还在主循环中吗?我可以在顶层窗口中使用另一个线程吗?
-
将
command = threading.Thread(...).start()更改为command = threading.Thread(...).start -
在使用 tkinter 时也不要使用线程。如果您尝试从不同的线程访问它,有时 tkinter 会崩溃。
-
但这应该不是太大的问题您仍然可以从一个线程更改小部件属性,同时将所有小部件保持在同一个线程中(包括窗口)
标签: python multithreading tkinter