GVKun编程网logo

tkinter循环和串行写入(tkinter 循环)

6

关于tkinter循环和串行写入和tkinter循环的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于*#【Python】【基础知识】【模块】【tkinter】【学用tkinter画图/制作

关于tkinter循环和串行写入tkinter 循环的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于*#【Python】【基础知识】【模块】【tkinter】【学用 tkinter 画图 / 制作窗口】、for循环和while循环、for循环和迭代器Iterator、GUI的最终选择 Tkinter(一):Tkinter最初体验等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

tkinter循环和串行写入(tkinter 循环)

tkinter循环和串行写入(tkinter 循环)

我已经使用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 serialser = 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()))

答案1

小编典典

语境

您使用了Tkintermainloopwhile-loop,现在您想将它们放到一个程序中。

while X:    do_y()

master.mainloop()

解决方案

有几种适合您的解决方案。

  1. 分割循环,并使用它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()

  2. 由我使用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循环。

  1. 用于update刷新GUI。
    while X:do_y()master.update()

这种方法是一种不寻常的方法,因为它取代了大多数GUI框架(例如Tkinter)中的mainloop。请注意,使用1和2可以有多个循环,而不仅仅是3中的一个。

  1. 使用新的执行线程来并行执行循环。!该线程不得直接访问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()

  2. 在新线程中启动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】【基础知识】【模块】【tkinter】【学用 tkinter 画图 / 制作窗口】

*#【Python】【基础知识】【模块】【tkinter】【学用 tkinter 画图 / 制作窗口】

Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下:

Tkinter:

  Tkinter 模块 (Tk 接口) 是 Python 的标准 Tk GUI 工具包的接口 .

  Tk 和 Tkinter 可以在大多数的 Unix 平台下使用,同样可以应用在 Windows 和 Macintosh 系统里。

  Tk8.0 的后续版本可以实现本地窗口风格,并良好地运行在绝大多数平台中。

wxPython:

  wxPython 是一款开源软件  

  是 Python 语言的一套优秀的 GUI 图形库,允许 Python 程序员很方便的创建完整的、功能健全的 GUI 用户界面。

Jython:

  Jython 程序可以和 Java 无缝集成。

  除了一些标准模块,Jython 使用 Java 的模块。

  Jython 几乎拥有标准的 Python 中不依赖于 C 语言的全部模块。

    比如,Jython 的用户界面将使用 Swing,AWT 或者 SWT。

  Jython 可以被动态或静态地编译成 Java 字节码。

 

------ 本专题只介绍 tkinter------

需要注意的是:

1、tkinter 是每个 python 版本都内置的一个图形库

2、在使用 turtle 库的时候 turtle 这个库是会调用 tkinter 这个库的

3、这个库在 py2 和 py3 里的名字是不一样的 python2 叫 Tkinter,python3 叫 tkinter

 

使用 tkinter 画图:

1、画圆形

2、画直线

3、画方形

4、制作 Windows 窗口

5、tkinter 中各属性及方法的使用介绍:

 

 

 

 一、画圆形

原题:

使用 tkinter 库画圆形。

原题给出的代码:

#!/usr/bin/python
# encoding=utf-8
# -*- coding: UTF-8 -*-

# 画图,学用circle画圆形。
if __name__ == ''__main__'':
    from tkinter import *
 
    canvas = Canvas(width=800, height=600, bg=''yellow'')  
    canvas.pack(expand=YES, fill=BOTH)                
    k = 1
    j = 1
    for i in range(0,26):
        canvas.create_oval(310 - k,250 - k,310 + k,250 + k, width=1)
        k += j
        j += 0.3
 
    mainloop()

 

输出结果:

  

 

 二、画直线

 原题:画图,学用 line 画直线

原题给出的代码:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
if __name__ == ''__main__'':
    from tkinter import *
 
    canvas = Canvas(width=300, height=300, bg=''green'')   
    canvas.pack(expand=YES, fill=BOTH)                  
    x0 = 263
    y0 = 263
    y1 = 275
    x1 = 275
    for i in range(19):
        canvas.create_line(x0,y0,x0,y1, width=1, fill=''red'')
        x0 = x0 - 5
        y0 = y0 - 5
        x1 = x1 + 5
        y1 = y1 + 5
 
    x0 = 263
    y1 = 275
    y0 = 263
    for i in range(21):
        canvas.create_line(x0,y0,x0,y1,fill = ''red'')
        x0 += 5
        y0 += 5
        y1 += 5
 
    mainloop()

 

输出效果:

 

 三、画方形

原题:

画图,学用 rectangle 画方形。

程序分析:

rectangle(int left, int top, int right, int bottom)

 参数说明:(left ,top) 为矩形的左上坐标,(right,bottom) 为矩形的右下坐标,两者可确定一个矩形的大小

 

原题给出的代码:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
if __name__ == ''__main__'':
    from tkinter import *
    root = Tk()
    root.title(''Canvas'')
    canvas = Canvas(root,width = 400,height = 400,bg = ''yellow'')
    x0 = 263
    y0 = 263
    y1 = 275
    x1 = 275
    for i in range(19):
        canvas.create_rectangle(x0,y0,x1,y1)
        x0 -= 5
        y0 -= 5
        x1 += 5
        y1 += 5
        
    canvas.pack()
    root.mainloop()

 

输出结果:

 

 四、使用 tkinter 制作 Windows 窗口:

源码:

#!/usr/bin/python
# -*- coding: GBK -*-
 
import tkinter
#import tkMessageBox  #Py2.0中
import tkinter.messagebox #Py3.0中
top = tkinter.Tk()

 
def helloCallBack():
   tkinter.messagebox.showinfo( "Hello Python", "Hello Runoob")
 
B = tkinter.Button(top, text ="sss", command = helloCallBack)
 
B.pack()

# 进入消息循环
top.mainloop()

 

效果:

 

 

点击按钮,出现:

 

 

 

 

 

其中 Tkinter 库的使用还需深入学习!

 五、tkinter 库的使用介绍:(上述代码中已使用的)

    tkinter 包含的方法:

    

>>> dir(tkinter)
[''ACTIVE'', ''ALL'', ''ANCHOR'', ''ARC'', ''BASELINE'', ''BEVEL'', ''BOTH'', ''BOTTOM'', ''BROWSE'', ''BUTT'', ''BaseWidget'', ''BitmapImage'', ''BooleanVar'', ''Button'', ''CASCADE'', ''CENTER'', ''CHAR'', ''CHECKBUTTON'', ''CHORD'', ''COMMAND'', ''CURRENT'', ''CallWrapper'', ''Canvas'', ''Checkbutton'', ''DISABLED'', ''DOTBOX'', ''DoubleVar'', ''E'', ''END'', ''EW'', ''EXCEPTION'', ''EXTENDED'', ''Entry'', ''Event'', ''EventType'', ''FALSE'', ''FIRST'', ''FLAT'', ''Frame'', ''GROOVE'', ''Grid'', ''HIDDEN'', ''HORIZONTAL'', ''INSERT'', ''INSIDE'', ''Image'', ''IntVar'', ''LAST'', ''LEFT'', ''Label'', ''LabelFrame'', ''Listbox'', ''MITER'', ''MOVETO'', ''MULTIPLE'', ''Menu'', ''Menubutton'', ''Message'', ''Misc'', ''N'', ''NE'', ''NO'', ''NONE'', ''NORMAL'', ''NS'', ''NSEW'', ''NUMERIC'', ''NW'', ''NoDefaultRoot'', ''OFF'', ''ON'', ''OUTSIDE'', ''OptionMenu'', ''PAGES'', ''PIESLICE'', ''PROJECTING'', ''Pack'', ''PanedWindow'', ''PhotoImage'', ''Place'', ''RADIOBUTTON'', ''RAISED'', ''READABLE'', ''RIDGE'', ''RIGHT'', ''ROUND'', ''Radiobutton'', ''S'', ''SCROLL'', ''SE'', ''SEL'', ''SEL_FIRST'', ''SEL_LAST'', ''SEPARATOR'', ''SINGLE'', ''SOLID'', ''SUNKEN'', ''SW'', ''Scale'', ''Scrollbar'', ''Spinbox'', ''StringVar'', ''TOP'', ''TRUE'', ''Tcl'', ''TclError'', ''TclVersion'', ''Text'', ''Tk'', ''TkVersion'', ''Toplevel'', ''UNDERLINE'', ''UNITS'', ''VERTICAL'', ''Variable'', ''W'', ''WORD'', ''WRITABLE'', ''Widget'', ''Wm'', ''X'', ''XView'', ''Y'', ''YES'', ''YView'', ''__builtins__'', ''__cached__'', ''__doc__'', ''__file__'', ''__loader__'', ''__name__'', ''__package__'', ''__path__'', ''__spec__'', ''_cnfmerge'', ''_default_root'', ''_exit'', ''_flatten'', ''_join'', ''_magic_re'', ''_setit'', ''_space_re'', ''_splitdict'', ''_stringify'', ''_support_default_root'', ''_test'', ''_tkerror'', ''_tkinter'', ''_varnum'', ''commondialog'', ''constants'', ''enum'', ''getboolean'', ''getdouble'', ''getint'', ''image_names'', ''image_types'', ''mainloop'', ''messagebox'', ''re'', ''simpledialog'', ''sys'', ''wantobjects'']
>>>

 

tkinter 为 module 类型

tkinter.ACTIVE 为 str 类型

tkinter.ACTIVE.capitalize  为内置方法 / 函数

>>> type(tkinter)
<class ''module''>
>>> type(tkinter.ACTIVE)
<class ''str''>
>>> type(tkinter.ACTIVE.capitalize)
<class ''builtin_function_or_method''>
>>> 

 

1、tkinter.messagebox

 

2、tkinter.Button

 

3、tkinter.Tk

 

 

 

 

 

 

 

 

 


————————(我是分割线)————————

参考:

1. RUNOOB.COM:

https://www.runoob.com/python/python-exercise-example56.html  / 画圆

https://www.runoob.com/python/python-gui-tkinter.html  / Python GUI 编程 (Tkinter)

 

https://www.runoob.com/python/python-tk-button.html    / 制作窗口

https://www.runoob.com/python/python-exercise-example57.html  / 画直线

https://www.runoob.com/python/python-exercise-example58.html  / 画方形

2、https://zhidao.baidu.com/question/432270397607348804.html 

 

 

备注:

初次编辑时间:2019 年 10 月 6 日 21:42:39

第一次修改时间:2019 年 10 月 7 日 10:31:36 / 除画圆外,增加了其他功能模块;

第二次修改时间:2019 年 10 月 7 日 15:45:12 / 以模块知识点命名,逐步深入学习该模块的使用方法和经典案例。

环境:Windows 7   / Python 3.7.2

 

for循环和while循环

for循环和while循环

for循环

 语法:for 变量名 in 条件; do …; done
 
 案例1:数字循环
 #!/bin/bash
sum=0
for i in `seq 1 100`
do
    sum=$[$sum+$i]
    echo $i
done
echo $sum

案例2:文件循环
 文件列表循环
 #!/bin/bash
cd /etc/
for a in `ls /etc/`
do
    if [ -d $a ]
    then
       ls -d $a
    fi
done

while循环

语法 while 条件; do … ; done
 案例1
 #!/bin/bash
while :
do
    load=`w|head -1|awk -F ''load average: '' ''{print $2}''|cut -d. -f1`
    if [ $load -gt 10 ]
    then
        top|mail -s "load is high: $load" asldkfls@11.com
    fi
    sleep 30
done

案例2
#!/bin/bash
while :
do
    read -p "Please input a number: " n
    if [ -z "$n" ]
    then
        echo "you need input sth."
        continue
    fi
    n1=`echo $n|sed ''s/[0-9]//g''`
    if [ -n "$n1" ]
    then
        echo "you just only input numbers."
        continue
    fi
    break
done
echo $n

for循环和迭代器Iterator

for循环和迭代器Iterator

迭代器模式:
把访问逻辑从不同类型的集合类中抽取出来,从而避免向外部暴露集合的内部结构。

Iterable接口:
foreach遍历集合的优势在于代码更加的简洁,更不容易出错,不用关心下标的起始值和终止值。
从本质上说,foreach其实就是在使用迭代器,在使用foreach遍历时对集合的结构进行修改,和在使用Iterator遍历时对集合结构进行修改本质上是一样的。同样会抛出异常,执行快速失败机制。

在使用Iterator的时候禁止对所遍历的容器进行改变其大小结构的操作。例如,在使用Iterator进行迭代时,如果对集合进行了add/remove操作就会出现ConcurrentModificationException异常。

RandomAccess
what is random and sequential access lists?
java集合类中元素的访问分为随机访问和顺序访问。
随机访问一般是通过index下标访问,行为类似数组的访问。而顺序访问类似于链表的访问,通常为迭代器遍历。

ArrayList是典型的随机访问型,而LinkedList则是顺序访问型。
List接口既定义了下标访问方法,又定义了迭代器方法。因此,其实例既可使用下标随机访问也可以使用迭代器进行遍历,但这两种方式的性能差异很明显。(下标访问比迭代器访问更快)

for循环与迭代器的对比:
1、ArrayList对随机访问比较快,而for循环中使用的get()方法,采用的即是 随机访问的方法,因此在ArrayList里for循环更快(foreach是一个内部循环体,多了其它的逻辑,虽然比for循环慢一些,但还是一个量级的);
2、LinkedList则是顺序访问比较快,Iterator中的next()方法,采用的是 顺序访问方法,因此在LinkedList里只用Iterator更快。
主要还是依据集合的数据结构不同的判断。

ArrayList和LinkedList随机访问的区别
ArrayList是数组结构,随机访问具有常量时间。
LinkedList是链表结构,随机访问分为两步:
1)根据index查找Node,通常是一个for循环查找到index对应的Node
2)返回Node中存储的元素

ArrayList的下标遍历性能高于LinkedList的下标遍历。

 

GUI的最终选择 Tkinter(一):Tkinter最初体验

GUI的最终选择 Tkinter(一):Tkinter最初体验

 EasyGui就是一个简单的文字交互界面模块,从今天开始来开始学习Tkinter

Tkinter是Python标准的Gui库,它实际是建立在Tk技术上的,Tk最初是为Tcl(一门工具名语言)所涉及的,但由于其可移植性和灵活性高,加上非常容易使用,因此它逐渐被移植到许多脚本语言中,包括Perl、Ruby和Python。

所以  TK + interface = Tkinter

Tkinter是Python默认的GUI库。像IDLE就是用Tkinter设计出来的,因此直接导入Tkinter模块就可以了。

>>> import tkinter
>>>

注:我安装的python版本是3.6的,所以不需要单独安装Tkinter,但是这里也备注下,如果是2.7版本就需要安装,并linux系统下,安装命令为:

apt install python - tk
yum imstall python - tools

Tkinter最初体验

我们来以一个列子进入Tkinter学习吧。

import tkinter as tk
root = tk.Tk()  #创建一个主窗口,用于容纳整个GUI程序
root.title("study python")  #设置主窗口标题栏
#添加一个Label组件,Label组件是GUI程序中常用组件之一
#Label组件可以显示文本、图标或图片
#在这里我们让他显示指定的文本 thelable
= tk.Label(root,text="这是我第一个tkinter程序窗口")
#然后调用Label组件的pack()方法,用于自动调节组件自身的尺寸 thelable.pack()
#注意,这个时候窗口还不会显示的。。。
#除非执行下面的这段代码,进入消息循环 root.mainloop()

执行结果

tkinter.mainloop()通常是程序的最后一行代码,执行后程序进入主事件循环。学习过界面的都知道一句名言:“Don''t call  me,I will can you.”就是一旦进入主事件循环,就由Tkinter掌握一起了。

进阶版本

如果要写一个大的程序就需要把代码进行封装,在面向对象的语言中,就是封装成类,来看进阶版的例子。

 1 import tkinter as tk
 2 
 3 class App():
 4     def __init__(self,root):
 5         frame = tk.Frame(root)#创建框架,然后在里面添加一个Button按钮,框架一般是用于在复杂的布局找你起到将组件分组作用
 6         frame.pack()
 7         self.hi_there = tk.Button(frame,text="欢迎学习python",fg="bule",command=self.say_hi)  #创建一个按钮组件,fg=foreground的缩写,就是设置前景色
 8         self.hi_there.pack(side=tk.LEFT)
 9     def say_hi(self):
10         print("python3学习要循序渐进")
11         
12 root = tk.Tk()
13 app = App(root)
14 root.mainloop()

执行结果图:

程序跑起来,在窗口中出现“欢迎学习python”,单击后在IDIE接收到反馈信息,反馈信息为:python3学习要循序渐进.

可以通过修改pack()方法的side参数,参数可以设置LEFT、RIGHT、TOP和TOTTOM四个方位,默认设置是:side=tkinter.TOP

例如可以修改为左对齐,frame.pack(side=tk.LEFT),修改后程序如图:

如果想让按钮靠近中间位置,可以通过设置pack()方法的padx和pady参数自定义按钮的偏移位置:

frame.pack(side=tk.LEFT,padx=100,pady=100)

按钮也可以设置背景色,需要用到bg参数,就是background背景的缩写:

self.hi_there = tk.Button(frame, text="欢迎学习python",fg="blue",bg="black", command=self.say_hi)

来改版后的完整程序为:

 1 import tkinter as tk
 2 
 3 class App():
 4     def __init__(self, root):
 5         frame = tk.Frame(root)
 6         #frame.pack()
 7         # frame.pack(side=tk.LEFT)
 8         frame.pack(side=tk.LEFT,padx=100,pady=100)
 9         # self.hi_there = tk.Button(frame, text="欢迎学习python",fg="blue", command=self.say_hi)
10         self.hi_there = tk.Button(frame, text="欢迎学习python",fg="blue",bg="black", command=self.say_hi)
11         self.hi_there.pack(side=tk.LEFT)
12 
13     def say_hi(self):
14         print("python3学习要循序渐进")
15 
16 root = tk.Tk()  #创建一个toplevel的根窗口,并把它作为一个参数传递给实例化对象app
17 app = App(root)
18 root.mainloop()

 

 

 

 

 

 

 

关于tkinter循环和串行写入tkinter 循环的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于*#【Python】【基础知识】【模块】【tkinter】【学用 tkinter 画图 / 制作窗口】、for循环和while循环、for循环和迭代器Iterator、GUI的最终选择 Tkinter(一):Tkinter最初体验等相关知识的信息别忘了在本站进行查找喔。

本文标签: