心灵莲花 發表於 2022-2-27 22:33:00

Python教程 - Tkinter

<p></p><div class="toc"><div class="toc-container-header">目录</div><ul><li>用户与程序的交互<ul><li>CLI</li><li>GUI</li></ul></li><li>python上的GUI库 -- Tkinter<ul><li>Tkinter窗体<ul><li>设置窗体的属性</li></ul></li><li>Tkinter显示控件--Label<ul><li>设置Label的背景颜色</li></ul></li><li>Tkinter按钮控件 -- Button<ul><li>按钮的点击事件处理</li></ul></li><li>Tkinter的输入框控件 -- Entry<ul><li>获取和设置输入框的文字</li></ul></li><li>tkinter的消息提醒控件 -- massagebox<ul><li>提示信息的几种形式</li></ul></li><li>tkinter的列表框控件 -- Listbox<ul><li>创建和设置Listbox</li><li>获取Listbox的选择内容</li><li>删除Listbox中的内容</li></ul></li></ul></li><li>单选按钮RadioButton</li><li>勾选按钮CheckButton</li><li>拖动条Scale</li></ul></div><p></p>
<h2 id="用户与程序的交互">用户与程序的交互</h2>
<ul>
<li>CLI(Command Line Interface,命令行接口)</li>
<li>GUI( Graphical User Interface,图形用户接口)</li>
</ul>
<h3 id="cli">CLI</h3>
<p>Command Line Interface,命令行接口,以一行文字作为输入,一般只能显示文字,例如windows自带的cmd</p>
<p><img src="https://img2022.cnblogs.com/blog/2764870/202202/2764870-20220227185324273-731237434.png"></p>
<h3 id="gui">GUI</h3>
<p>Graphical User Interface,图形用户接口,我们常用的window系统就有很多丰富的界面,包括窗口、按钮、文本显示,图片显示等等</p>
<p><img src="https://img2022.cnblogs.com/blog/2764870/202202/2764870-20220227185349214-656671120.png"></p>
<h2 id="python上的gui库----tkinter">python上的GUI库 -- Tkinter</h2>
<p>Tkinter 是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。IDLE、turtle界面也是用 Tkinter 编写而成。</p>
<h3 id="tkinter窗体">Tkinter窗体</h3>
<p>Python自带的可编辑的GUI界面,是一个图像窗口。Tkinter是使用 python 进行窗口视窗设计的模块。<br>
示例:</p>
<pre><code class="language-python"># 导入tkinter库
import tkinter

# 创建一个窗体
main = tkinter.Tk()
# 进入消息循环,让窗口可以不断刷新
main.mainloop()
</code></pre>
<h4 id="设置窗体的属性">设置窗体的属性</h4>
<pre><code class="language-python">import tkinter

main = tkinter.Tk()
# 设置标题
main.title("My First Window")
# 设置大小(宽x高)
main.geometry("300x200")
main.mainloop()
</code></pre>
<p><img src="https://img2022.cnblogs.com/blog/2764870/202202/2764870-20220227215114319-200461913.png"></p>
<h3 id="tkinter显示控件--label">Tkinter显示控件--Label</h3>
<p>Label(标签)控件,是最简单的显示控件,可以显示一些文字<br>
示例:</p>
<pre><code class="language-python">import tkinter

main = tkinter.Tk()
l = tkinter.Label(main,text='First Label')
l.pack()
main.mainloop()
</code></pre>
<p><img src="https://img2022.cnblogs.com/blog/2764870/202202/2764870-20220227215125579-1208599507.png"><br>
其中'l.pack()'表示将创建的Label控件l放到main布局中</p>
<h4 id="设置label的背景颜色">设置Label的背景颜色</h4>
<p>可在创建Label控件时指定bg属性为相应的背景颜色<br>
示例:</p>
<pre><code class="language-python">import tkinter

main = tkinter.Tk()
l = tkinter.Label(main,text='First Label',bg='red')
l.pack()
main.mainloop()
</code></pre>
<p><img src="https://img2022.cnblogs.com/blog/2764870/202202/2764870-20220227215135715-1318578885.png"></p>
<p>也可以通过config方式进行配置<br>
Label可以设置以下属性</p>
<table>
<thead>
<tr>
<th>属性</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>bg</td>
<td>背景颜色</td>
</tr>
<tr>
<td>fg</td>
<td>前景颜色,即文字的颜色</td>
</tr>
<tr>
<td>text</td>
<td>显示的文字</td>
</tr>
<tr>
<td>height</td>
<td>控件的高度,Label中表示为一个字符高度的多少倍</td>
</tr>
<tr>
<td>width</td>
<td>控件的宽度,Label中表示为一个字符宽度的多少倍</td>
</tr>
<tr>
<td>...</td>
<td>...</td>
</tr>
<tr>
<td>示例</td>
<td></td>
</tr>
</tbody>
</table>
<pre><code class="language-python">import tkinter

main = tkinter.Tk()
l = tkinter.Label(main)
l.config(text='First Label')
l.config(bg='red')
l.pack()
main.mainloop()
</code></pre>
<p><img src="https://img2022.cnblogs.com/blog/2764870/202202/2764870-20220227220621646-1765057307.png"></p>
<h3 id="tkinter按钮控件----button">Tkinter按钮控件 -- Button</h3>
<p>Button(按钮)可以让用户点击<br>
示例</p>
<pre><code class="language-python">b = tkinter.Button(main)
b.config(text='First Button')
b.pack()
</code></pre>
<p><img src="https://img2022.cnblogs.com/blog/2764870/202202/2764870-20220227221457377-384615155.png"><br>
同理,也可以设置config改变背景颜色等属性</p>
<pre><code class="language-python">b = tkinter.Button(main)
b.config(text='First Button')
b.config(bg='green')
b.pack()
</code></pre>
<p><img src="https://img2022.cnblogs.com/blog/2764870/202202/2764870-20220227221853863-334862888.png"></p>
<h4 id="按钮的点击事件处理">按钮的点击事件处理</h4>
<p>以上示例的按钮点击没有任何反应,因为我们还没有设置按钮的command属性,该属性表示点击按钮后会调用的函数。<br>
因此我们需要先定义一个函数,例如</p>
<pre><code class="language-python">def btn_click():
    print('Button Click')
</code></pre>
<p>然后,设置按钮的command属性为上面定义的btn_click函数</p>
<pre><code>b.config(command=btn_click)
</code></pre>
<p>运行程序,点击按钮,观察IDLE输出,可以观察到,每次点击按钮,IDLE都会输出一句Button Click<br>
<img src="https://img2022.cnblogs.com/blog/2764870/202202/2764870-20220227222729704-1210039551.png"><br>
我们也可以通过按钮的点击事件改变其他控件的属性,例如label控件的显示文字,只需要在btn_click</p>
<pre><code class="language-python">def btn_click():
    print('Button Click')
    l.config(text='changed')
</code></pre>
<p>运行程序,点击按钮就会改变label的显示文字了<br>
<img src="https://img2022.cnblogs.com/blog/2764870/202203/2764870-20220306154114684-2117015293.png"></p>
<p>完整代码为:</p>
<pre><code class="language-python">import tkinter

def btn_click():
    print('Button Click')

main = tkinter.Tk()
main.title('Hello tkinter')
main.geometry('300x200')

l = tkinter.Label(main, text='First label')
l.config(bg='red')
l.config(fg='white')
l.config(height=5)
l.config(width=20)
l.pack()

b = tkinter.Button(main,text='Click me')
b.config(bg='green')
b.config(command=btn_click)
b.pack()

main.mainloop()

</code></pre>
<h3 id="tkinter的输入框控件----entry">Tkinter的输入框控件 -- Entry</h3>
<p>Python Tkinter 文本框用来让用户输入一行文本字符串。<br>
示例, 创建一个输入框</p>
<pre><code class="language-python">e = tkinter.Entry(main)
e.pack()
</code></pre>
<p><img src="https://img2022.cnblogs.com/blog/2764870/202203/2764870-20220306155655000-1356222191.png"></p>
<h4 id="获取和设置输入框的文字">获取和设置输入框的文字</h4>
<p>有了输入框,我们可以让用户输入文字。但是上面的程序还没有处理用户输入了什么。<br>
我们通过按钮的事件来进行配合,label的文字改为提示语:“Input some text:”,button的文字改为“OK”,并在button_click函数中处理输入框entry里用户输入的文字</p>
<pre><code class="language-python">def btn_click():
    print(e.get())
    l.config(text=e.get())
</code></pre>
<p>这样我们在输入框entry输入文字后,点击OK按钮,会发现标签label的文字也会随之改变<br>
<img src="https://img2022.cnblogs.com/blog/2764870/202203/2764870-20220306160310379-1858915934.png"><br>
我们也可以一开始在创建输入框entry的时候设置默认的文字</p>
<pre><code class="language-python">e = tkinter.Entry(main)
e.insert(0,'000')
e.pack()
</code></pre>
<p>这样窗口创建时entry就会自动有默认的输入文字<br>
完整代码如下:</p>
<pre><code class="language-python">import tkinter

def btn_click():
    print(e.get())
    l.config(text=e.get())

main = tkinter.Tk()
main.title('Hello tkinter')
main.geometry('300x200')

l = tkinter.Label(main, text='Input some text')
l.config(bg='red')
l.config(fg='white')
l.config(height=2)
l.config(width=20)
l.pack()

e = tkinter.Entry(main)
e.insert(0,'000')
e.pack()

b = tkinter.Button(main,text='OK')
b.config(bg='green')
b.config(command=btn_click)
b.pack()

main.mainloop()
</code></pre>
<h3 id="tkinter的消息提醒控件----massagebox">tkinter的消息提醒控件 -- massagebox</h3>
<p>消息框,用于显示你应用程序的消息框,也就是我们平时看到的弹窗。<br>
一个简单的提示框示例:</p>
<pre><code>import tkinter.messagebox# 要使用messagebox先要导入模块

tkinter.messagebox.showinfo(title='tips', message='Hello!')
</code></pre>
<p>消息框messagebo一般在用户进行了某些操作之后处理信息时使用。<br>
因此,经常会在按钮button的点击事件函数里使用。<br>
例如,我们可以接着上面的例子,在用户点击button后,获取输入框entry的文字进行相应的提示:</p>
<pre><code class="language-python">import tkinter.messagebox

def btn_click():
    tkinter.messagebox.showinfo(title='tips', message=e.get())
</code></pre>
<h4 id="提示信息的几种形式">提示信息的几种形式</h4>
<p>messagebox提示信息的几种形式:</p>
<pre><code class="language-python">tkinter.messagebox.showinfo(title='tips', message='hello')            # 提示信息对话窗
tkinter.messagebox.showwarning(title='tips', message='warning')       # 提出警告对话窗
tkinter.messagebox.showerror(title='tips', message='error!')         # 提出错误对话窗
print(tkinter.messagebox.askquestion(title='tips', message='need some help?'))# 询问选择对话窗return 'yes', 'no'
print(tkinter.messagebox.askyesno(title='tips', message='hello'))   # return 'True', 'False'
print(tkinter.messagebox.askokcancel(title='tips', message='hello'))# return 'True', 'False'
</code></pre>
<table>
<thead>
<tr>
<th>对话框</th>
<th>示例</th>
</tr>
</thead>
<tbody>
<tr>
<td>showinfo提示信息对话框</td>
<td><img src="https://img2022.cnblogs.com/blog/2764870/202203/2764870-20220306213154169-845302788.png"></td>
</tr>
<tr>
<td>showwarning提示警告对话框</td>
<td><img src="https://img2022.cnblogs.com/blog/2764870/202203/2764870-20220306213311740-996862742.png"></td>
</tr>
<tr>
<td>showerror提示错误对话框</td>
<td><img src="https://img2022.cnblogs.com/blog/2764870/202203/2764870-20220306213352254-1587493260.png"></td>
</tr>
<tr>
<td>askyesno选择对话框</td>
<td><img src="https://img2022.cnblogs.com/blog/2764870/202203/2764870-20220306213036352-2030952030.png"></td>
</tr>
</tbody>
</table>
<p>我们可以根据判断用户的输入来进行不同形式的提示,例如判断输入是不是为“123456”<br>
示例</p>
<pre><code class="language-python">import tkinter.messagebox

def btn_click():
    if e.get() == '123456':
      tkinter.messagebox.showinfo(title='tips', message='bingo')
    else:
      tkinter.messagebox.showerror(title='tips', message='error')
</code></pre>
<p>完整代码:</p>
<pre><code class="language-python">import tkinter
import tkinter.messagebox

def btn_click():
    if e.get() == '123456':
      tkinter.messagebox.showinfo(title='tips', message='bingo')
    else:
      tkinter.messagebox.showerror(title='tips', message='error')

main = tkinter.Tk()
main.title('Hello tkinter')
main.geometry('300x200')

l = tkinter.Label(main, text='Input some text')
l.config(bg='red')
l.config(fg='white')
l.config(height=2)
l.config(width=20)
l.pack()

e = tkinter.Entry(main)
e.insert(0,'000')
e.pack()

b = tkinter.Button(main,text='OK')
b.config(bg='green')
b.config(command=btn_click)
b.pack()

main.mainloop()
</code></pre>
<h3 id="tkinter的列表框控件----listbox">tkinter的列表框控件 -- Listbox</h3>
<p>Listbox(列表框)组件用于显示一个选择列表。Listbox 只能包含文本项目,并且所有的项目都需要使用相同的字体和颜色。根据组件的配置,用户可以从列表中选择一个或多个选项。</p>
<h4 id="创建和设置listbox">创建和设置Listbox</h4>
<p>创建一个Listbox,并放置到主窗口:</p>
<pre><code class="language-python">lbox = tkinter.Listbox(main)
lbox.pack()
</code></pre>
<p>此时创建的Listbox没有任何内容,需要往里面插入内容<br>
例如插入fruits:</p>
<pre><code class="language-python">fruits = ['apple', 'banana', 'orange']
for f in fruits:
    lbox.insert('end', f)
</code></pre>
<p><img src="https://img2022.cnblogs.com/blog/2764870/202203/2764870-20220320171150228-64959263.png"><br>
完整代码:</p>
<pre><code class="language-python">import tkinter

main = tkinter.Tk()
main.title('Hello tkinter')
main.geometry('300x300')

lbox = tkinter.Listbox(main)
lbox.pack()

fruits = ['apple', 'banana', 'orange']
for f in fruits:
    lbox.insert('end', f)

main.mainloop()
</code></pre>
<h4 id="获取listbox的选择内容">获取Listbox的选择内容</h4>
<p>curselection():</p>
<blockquote>
<p>返回一个元组,包含被选中的选项的序号(从 0 开始)<br>
如果没有选中任何选项,返回一个空元组</p>
</blockquote>
<p>get(first, last=None):</p>
<blockquote>
<p>返回一个元组,包含参数 first 到 last 范围内(包含 first 和 last)的所有选项的文本<br>
如果忽略 last 参数,表示返回 first 参数指定的选项的文本</p>
</blockquote>
<p>例如,添加一个按钮获取Listbox选择的内容:</p>
<pre><code class="language-python">def btn_click():
    sl = lbox.curselection()
    for i in sl:
      print(i)
      tkinter.messagebox.showinfo(message=lbox.get(i))

b = tkinter.Button(main, text='ok')
b.config(command=btn_click)
b.pack()
</code></pre>
<p><img src="https://img2022.cnblogs.com/blog/2764870/202203/2764870-20220320171244659-1195393580.png"><br>
完整代码:</p>
<pre><code class="language-python">import tkinter
import tkinter.messagebox

def btn_click():
    sl = lbox.curselection()
    for i in sl:
      print(i)
      tkinter.messagebox.showinfo(message=lbox.get(i))

main = tkinter.Tk()
main.title('Hello tkinter')
main.geometry('300x300')

lbox = tkinter.Listbox(main)
lbox.pack()

fruits = ['apple', 'banana', 'orange']
for f in fruits:
    lbox.insert('end', f)

b = tkinter.Button(main, text='ok')
b.config(command=btn_click)
b.pack()

main.mainloop()
</code></pre>
<h4 id="删除listbox中的内容">删除Listbox中的内容</h4>
<p>delete(first, last=None):</p>
<blockquote>
<p>删除参数 first 到 last 范围内(包含 first 和 last)的所有选项<br>
如果忽略 last 参数,表示删除 first 参数指定的选项</p>
</blockquote>
<p>例如在btn_click中将选择的内容用delete删除:</p>
<pre><code class="language-python">def btn_click():
    sl = lbox.curselection()
    for i in sl:
      print(i)
      lbox.delete(i)
</code></pre>
<p>选择其中一个内容(例如banana),然后点击按钮,就可以发现选择的内容已被删除<br>
<img src="https://img2022.cnblogs.com/blog/2764870/202203/2764870-20220320172044069-214795624.png"><br>
<img src="https://img2022.cnblogs.com/blog/2764870/202203/2764870-20220320172058520-690642351.png"><br>
完整代码:</p>
<pre><code class="language-python">import tkinter
import tkinter.messagebox

def btn_click():
    sl = lbox.curselection()
    for i in sl:
      print(i)
      lbox.delete(i)

main = tkinter.Tk()
main.title('Hello tkinter')
main.geometry('300x300')

lbox = tkinter.Listbox(main)
lbox.pack()

fruits = ['apple', 'banana', 'orange']
for f in fruits:
    lbox.insert('end', f)

b = tkinter.Button(main, text='delete')
b.config(command=btn_click)
b.pack()

main.mainloop()
</code></pre>
<h2 id="单选按钮radiobutton">单选按钮RadioButton</h2>
<p>RadioButton一般用于提供一组选项,让用户从多个选项中选择其中一个。<br>
<img src="https://img2022.cnblogs.com/blog/2764870/202204/2764870-20220417184643936-1673970645.png"><br>
完整代码:</p>
<pre><code class="language-python">import tkinter

def rbtn_selected():
    print('You select', v.get())

main = tkinter.Tk()
main.geometry("300x300")

v = tkinter.IntVar()

r1 = tkinter.Radiobutton(main, text='One', variable=v, value=1)
r1.config(command=rbtn_selected)
r1.pack()

r2 = tkinter.Radiobutton(main, text='Two', variable=v, value=2)
r2.config(command=rbtn_selected)
r2.pack()

r3 = tkinter.Radiobutton(main, text='Three', variable=v, value=3)
r3.config(command=rbtn_selected)
r3.pack()

main.mainloop()
</code></pre>
<h2 id="勾选按钮checkbutton">勾选按钮CheckButton</h2>
<p>CheckButton一般用于提供一组选项,让用户从其中选择多个。<br>
<img src="https://img2022.cnblogs.com/blog/2764870/202205/2764870-20220515184125006-146560982.png"><br>
完整代码</p>
<pre><code class="language-python">import tkinter

def cbtn_selected():
    print('You select', v1.get(), v2.get())

main = tkinter.Tk()
main.geometry("300x300")

v1 = tkinter.IntVar()
v2 = tkinter.IntVar()

c1 = tkinter.Checkbutton(main, text='apple', variable=v1, onvalue=1, offvalue=0)
c1.config(command=cbtn_selected)
c1.pack()

c2 = tkinter.Checkbutton(main, text='banana', variable=v2, onvalue=1, offvalue=0)
c2.config(command=cbtn_selected)
c2.pack()

main.mainloop()
</code></pre>
<h2 id="拖动条scale">拖动条Scale</h2>
<p>Scale一般用于提供一个范围内的数字选择,让用户可以拖动。<br>
<img src="https://img2022.cnblogs.com/blog/2764870/202205/2764870-20220515185554971-988808034.png"><br>
完整代码</p>
<pre><code class="language-python">import tkinter

def btn_click():
    print('horizontal', s1.get())
    print('vertical', s2.get())

main = tkinter.Tk()
main.geometry("300x300")

s1 = tkinter.Scale(main, label='drag me', from_=1, to=100)
s1.config(orient=tkinter.HORIZONTAL)
s1.pack()

s2 = tkinter.Scale(main, label='drag me', from_=1, to=100)
s2.config(orient=tkinter.VERTICAL)
s2.pack()

b = tkinter.Button(main, text='OK')
b.config(command=btn_click)
b.pack()

main.mainloop()

</code></pre><br><br>
来源:https://www.cnblogs.com/hgrun/p/python-tkinter.html
頁: [1]
查看完整版本: Python教程 - Tkinter