我已经使用tkinter编写了gui,我需要将2个音阶的值实时发送到arduino。我已经验证了arduino正在使用另一个草图发送值到arduino并接收到这些草图,我已经在以下代码中添加了我的python代码
while True:
#command = raw_input("Enter level ")
#if command == '1' :
ser.write("c"+str (c1v.get()))
ser.write(":d"+str (c2v.get()))
我已经在tkinter
mainloop的内部和外部移动了它,并且从gui获得了不同的结果,而gui只在关闭gui时才不加载到数据中。有人可以告诉我如何让gui运行,并且当我移动秤时,该值会通过串行实时发送到arduino。
这是代码:
from Tkinter import *
import serial
ser = serial.Serial('/dev/ttyAMA0', 9600)
master= Tk()
master.geometry('500x500+0+0')
def print_value(val):
print ("c1="+str (c1v.get()))
print ("c2="+str(c2v.get()))
c1v=DoubleVar()
c2v=DoubleVar()
c1 = Scale(master, from_=255, to=0, length =400,width =100, troughcolor = 'blue',command=print_value, variable =c1v)
c1.grid(row=1,column=1)
c2 = Scale(master, from_=255, to=0, length =400,width =100, troughcolor = 'blue',command=print_value, variable =c2v)
c2.grid(row=1,column=2)
def load_p1():
pass
lp1 = open("/home/pi/Desktop/IEP/test/preset_test.txt")
val1, val2 = (x.split("=")[1] for x in lp1)
c1.set(val1)
c2.set(val2)
lp1.close()
#
def record():
save_path = '/home/pi/Desktop/IEP/test'
name_of_file = ("preset_test")
completeName = os.path.join(save_path, name_of_file+".txt")
file1 = open(completeName , "w")
toFile = ("c1="+str (c1.get())+ "\n""c2="+str(c2.get()))
file1.write(toFile)
file1.close()
rec=Button(master, text="Record",width=20, height=10, bg='Red', command=record)
rec.grid(row=2, column=1)
load=Button(master, text="Load",width=20, height=10, bg='gold',command=load_p1)
load.grid(row=2, column=2)
master.mainloop()
while True:
#command = raw_input("Enter level ")
#if command == '1' :
ser.write("c"+str (c1v.get()))
ser.write(":d"+str (c2v.get()))
语境
您使用了Tkintermainloop
和while
-loop,现在您想将它们放到一个程序中。
while X:
do_y()
和
master.mainloop()
解决方案
有几种适合您的解决方案。
分割循环,并使用它after
来让GUI回叫您:
def do_y2():
do_y()
if X:
master.after(123, do_y2) # after 123 milli seconds this is called again
do_y2()
master.mainloop()
由我使用guiLoop。
from guiLoop import guiLoop # https://gist.github.com/niccokunzmann/8673951#file-guiloop-py
@guiLoop
def do_y2():
while X:
do_y()
yield 0.123 # give the GUI 123 milli seconds to do everything
do_y2(master)
master.mainloop()
guiLoop使用从1开始的方法。但是允许您使用一个或多个while循环。
update
刷新GUI。while X:
do_y()
master.update()
这种方法是一种不寻常的方法,因为它取代了大多数GUI框架(例如Tkinter)中的mainloop。请注意,使用1和2可以有多个循环,而不仅仅是3中的一个。
使用新的执行线程来并行执行循环。!该线程不得直接访问master或任何GUI元素,因为Tkinter可能会崩溃!
import threading
def do_y_loop():
while X:
do_y()
thread = threading.Thread(target = do_y_loop)
thread.deamon = True # use this if your application does not close.
thread.start()
master.mainloop()
在新线程中启动mainloop。与4中一样,如果您从线程访问GUI,Tkinter可能会崩溃。
import threading
thread = threading.Thread(target = master.mainloop)
thread.deamon = True # use this if your application does not close.
thread.start()
while X:
do_y()
在4.和5.中,GUI和while循环之间的通信可以/应该通过全局变量进行,但绝不能通过tkinter方法进行。
基本上,我正在Python中的一个订阅计数器应用程序的“草案”上工作。我使用YouTube数据API从YouTube获取数据,然后循环这段代码以更新订阅者计数。但是由于我的GUI代码在循环之后,它永远不会开始,因为循环是无限的,永远不会结束。我尝试将GUI部分放在代码之前,以获得子计数,但没有定义任何变量,因此返回错误。所以基本上,我的问题是如何重新组织它,使其工作,子计数在GUI中更新。我听说过
我是python和tkinter的新手。。。我使用Tkinter显示仪表并通过串行com接收信息。我已经准备好GUI,现在需要读取序列值。 我面临的问题是我不能连续读取串行COM。我遇到了,但它仍然不起作用。基本上它不会在控制台上显示任何值。知道可能出了什么问题吗? 这是主要代码。我还有一个文件meter.py
问题内容: 到现在为止,我以前以:结束我的Tkiter程序,否则什么都不会出现!参见示例: 但是,当尝试该程序的下一步(使球随着时间移动)时,该书正在阅读,并说要执行以下操作。将绘图功能更改为: 并将以下代码添加到我的程序中: 但是我注意到,添加此代码块使之无用,因为即使没有它,所有内容也会显示出来!!! 此时,我应该提到我的书从未谈论过(也许是因为它使用了Python 3),但是由于我的程序无法
我有以下代码: 这里的主要循环是: 但是我不确定这是最好的方法(如果我想输入什么,这是行不通的) 然后我试了这个: 但正如我所意识到的,这并不像我预期的那么快。所以问题是:创建主循环的最佳方法是什么?
问题内容: 我希望代码在后台运行并定期更新我的GUI。我该怎么做? 例如,假设我想在GUI代码的背景中执行以下操作,如下所示: 这是GUI代码: 问题答案: 尚不清楚顶部的代码应该做什么,但是,如果只想每秒(或每秒钟)调用一个函数,则可以使用该方法。 因此,如果您只想使用进行操作,则可能需要执行以下操作: 您可以将此函数作为您类的方法(在本例中称为),您的代码将如下所示:
问题内容: 我有以下代码: 这里的主要循环是: 但是我不确定这是做到这一点的最佳方法(如果我想输入一些信息,这将不起作用) 然后我尝试了这个: 但是,正如我已经意识到的那样,它并没有达到我的预期。所以问题是:创建主循环的最佳方法是什么? 问题答案: Tkinter为此提供了一个强大的工具,它被称为after。它旨在用作同步睡眠命令,但可以通过调用自身在mainloop内建立一个循环。 之后,是一个