新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

《新大榭》- 创大榭地方网络社区先锋品牌 新大榭始终专注于地方网络社区平台的建设 关于我们- [大记事]- 留言建议- [新手报道]

新大榭软件管家 V5.8 Excel版 微信版 发布 财务/仓库/生产/销售/采购/行政/人事/校园 客服中心 - 办公软件 - 网站设计 - 广告招商

新大榭镜像 - 官方Web实验室 - 加入收藏 - 设为首页 广告是为了更好的发展 欢迎我区企业及商家赞助本站 首页文字黄金广告位(赞助)公益广告免费发布

查看: 160|回复: 1

[模块] 7580 - Python库【tkinter】模块介绍(选学:课外拓展介绍)

 关闭 [复制链接]
发表于 2021-8-21 17:49:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转新大榭论坛!

您需要 登录 才可以下载或查看,没有账号?注册

x
本文我们将学习如何使用Tkinter包编写一些图形用户界面程序。Tkinter是Python的一个标准包,因此我们并不需要安装它。我们将从创建一个窗口开始,然后我们在其之上加入一些小组件,比如按钮,复选框等,并使用它们的一些属性。话不多说,让我们开始吧!
5 p# {2 ]+ e# k/ Q2 h5 }7 I' J0 l: c( I8 u% A( I2 `
创建一个窗口+ H1 d5 ?7 F- K2 w4 j. W) f
首先,我们导入Tkinter包,然后创建一个窗口,最后给这个窗口设置标题。
( b0 m8 V5 j/ ?2 Y  [
  1. from tkinter import *
    1 E5 X# q0 M' K

  2. 9 |- x- f& o5 X4 U  H) x
  3. window = Tk()3 }3 ?4 B; W4 J
  4. window.title("First Window")1 ^7 i9 @4 G5 j5 ^& m
  5. window.mainloop()
复制代码
结果如下:) h6 |# a4 h- H. ~7 g5 w
7580-01-01.jpg # C0 `3 V. `5 ~) N: L& v

8 S* [: r5 ~( [最后一行我们调用了mainloop函数,这个函数将让窗口等待用户与之交互,直到我们关闭它。如果忘记调用mainloop函数的话,将不会向用户显示任何内容(没有窗口)。- x  G- p6 V8 ?) `7 ^8 x$ S
: j) r* d9 Y* p& T
添加一个标签组件# y6 R* L3 a0 }! n9 B
为了给之前的例子增加一个标签组件,我们可以使用Label类:) W: ]% h0 X1 q% }& g8 `
  1. lbl = Label(window, text="Hello")
复制代码
我们可以通过grid函数设置其在窗口的位置:% `: r  M* E) I6 ?$ [
  1. lbl.grid(column=0, row=0)
复制代码
完整代码如下所示:8 q2 y* [6 b1 m3 S
  1. from tkinter import *, X5 F3 A1 h: q; w
  2. & k" e7 t% P* }: u
  3. window = Tk()7 E) R; @+ S& z1 G
  4. window.title("First Window")0 t- |  k+ f9 E# ]) h
  5. lbl = Label(window, text="Hello")
    . J- T" y' j) C
  6. lbl.grid(column=0, row=0). ]6 ]6 |" {! x3 F3 c! L$ f
  7. window.mainloop()
复制代码
结果如下:+ K! i( v7 F( \
7580-01-02.jpg 3 c+ ~2 K: _  L" ]- ^
值得注意的是lbl没有调用grid函数的话是不会显示的。
- ~- j0 Y9 S$ r  y
' d  y7 p: Q' X4 A0 j4 r% X: L3 N设置标签字体大小
1 v3 a4 P1 u$ n$ |我们可以使用font参数设置标签字体大小:6 ]: |6 v& w! I7 b; L
  1. lbl = Label(window, text="Hello", font=("Arial Bold", 50))
复制代码
7580-01-03.jpg * K* S& U! l# _& p
- O5 v" V3 j6 Q+ [3 y) u1 `5 n
font参数不光可以在标签组件中用,其他组件也可以使用呢!/ z- ^/ @0 G9 b9 T7 M
可是,现在窗口貌似太小了,连窗口的标题都看不全,如何设置窗口大小呢?
) _# B  d$ h* V- u% V
' p' ?+ ^5 x. b3 |设置窗口大小
! x/ D4 A! A3 n" l2 q, F我们可以用geometry函数来设置窗口大小:
) }7 I3 ?2 }# B7 `+ E
  1. window.geometry("350x200")
复制代码
以上代码将会把窗口设置成350个像素宽,200个像素高。2 p+ p! F2 e4 f( @4 s( K

4 S1 b! K' U# s/ G' C; f添加一个按钮组件
6 h2 a6 t) \! d4 a% {. M: ?, t, V让我们给窗口增加一个按钮组件,它的创建和添加方式和标签组件差不多:9 ]: b" b) W6 H0 Y% N
  1. btn = Button(window, text="Click Me")
    * d+ N+ }9 p7 _" V* B8 @8 H
  2. btn.grid(column=1, row=0)
复制代码
完整代码如下所示:
/ n6 E5 b3 X& ]# V3 F
  1. from tkinter import *</font>
    7 J+ O; X: S- f7 p( `( u

  2. + B4 A# `; r$ M8 [5 ]5 h
  3. window = Tk()
      v+ j$ T5 p4 o, Q7 @
  4. window.title("First Window")
    9 U7 P! V* C$ Z+ }9 X1 l6 D5 h
  5. window.geometry("350x200")% a. w8 M# q" S2 x1 w* ]
  6. lbl = Label(window, text="Hello")
    & h+ ]) U& f( C& C5 O
  7. lbl.grid(column=0, row=0)* K- K) ~' a3 H, H2 b
  8. btn = Button(window, text="Click Me")6 Z# V( q+ r% l, q7 f( @/ Z7 ^
  9. btn.grid(column=1, row=0)
    5 G" }4 {8 ]" Q6 {* o) g; `
  10. window.mainloop()
复制代码
结果如下:
0 x" r- B! f$ P9 ]% M& U& c 7580-01-04.jpg 1 t/ t9 H; Y7 V/ U
/ u& A0 X/ v; Y3 h
#### 更改按钮前景和背景颜色! ]4 h  q) U6 I4 f2 K/ `) s
我们可以用fg参数设置按钮或其他组件的前景色。; `) Z6 k) a7 r  i
我们可以用bg参数设置按钮或其他组件的背景色。5 l- k# F6 V1 a9 Z$ E5 D& i1 X
  1. btn = Button(window, text="Click Me", bg="orange", fg="red")
复制代码
7580-01-05.jpg
1 X( y  N: e" G- G5 b% S. F2 A' O
% I# P$ j0 r: |/ b/ o8 H& S3 ]现在,如果点击按钮,什么都不会发生,因为我们没有写处理点击事件的代码。$ `$ F# D2 ~) K; o* b$ ^
; \  ?# h; n+ Z. A; I, A2 P% p
处理按钮点击事件
2 W7 l# y& d8 U首先,我们编写一个当按钮点击后需要执行的函数:0 B1 x1 p+ R4 b% U- O, G+ p- c1 O
  1. def clicked():
    ( }0 z2 S, U5 m3 [- x
  2.     lbl.configure(text="Button was clicked!")
复制代码
然后,我们注明一下点击时要调用的函数:% Z: \( s) ^8 K, r7 e) W5 |) y- ]
  1. btn = Button(window, text="Click Me", command=clicked)
复制代码
完整代码如下所示:
' @3 x* n3 a9 W; N9 D% K/ d" h/ R
  1. from tkinter import *8 G6 v( C0 N8 V9 s, ^
  2. - ?8 v) H0 E+ H6 U9 Y: o' b. Z" I% n
  3. window = Tk()1 P( L' h! `* B# Y+ T% k% ~
  4. window.title("First Window")+ D: m3 v& B: ]0 Y$ P( Q1 C
  5. window.geometry("350x200")
      y! ~  G9 V7 ~3 y
  6. lbl = Label(window, text="Hello")2 u2 ~: p6 J" X3 A2 z
  7. lbl.grid(column=0, row=0)+ p1 J  F( b$ }7 C
  8. - A2 |9 Q, a! f3 L  t, c2 J* n) x. z
  9. def clicked():2 t2 E! I+ _- l' V
  10.     lbl.configure(text="Button was clicked!")
    : y$ C- T' F4 Y; D1 k

  11. ' r  d* m# a: o! y1 Y9 k7 Y
  12. btn = Button(window, text="Click Me", command=clicked)
    : C& J! [& Y3 H8 m$ O$ {) _, E$ a
  13. btn.grid(column=1, row=0)
    " t7 h; F' H: `) n% t2 |8 ^5 [
  14. window.mainloop()
复制代码
当我们点击按钮后,结果如下:9 H1 [2 _' M9 j
7580-01-06.jpg 4 e; i7 ^9 h) G7 |8 A, c9 E

' S4 S5 w1 v& g添加一个文本框5 {/ Q. @# y5 M9 r
在之前的例子中我们了解了如何添加一些简单组件,现在我们将通过Tkinter的Entry类获取到用户输入。我们可以这样用Entry类创建一个文本框:' X5 o4 w, K- O8 \
  1. txt = Entry(window, width=10)
复制代码
然后可以用grid函数像之前那样添加到窗口中。
% \& E* p' ?/ P/ m: \
  1. from tkinter import *  U: r2 z5 h2 ]% O7 L

  2. 3 t0 `- q& b5 n0 m, S" A# ]
  3. window = Tk()! L! U5 ~' Q2 N+ ^- ~0 d- V2 s5 Y
  4. window.title("First Window")+ B/ U9 g) R+ k( u- M5 Y- E
  5. window.geometry("350x200"): J6 b" ?- @" z# _- E+ c
  6. lbl = Label(window, text="Hello")
    8 d5 ^* r, ]. _
  7. lbl.grid(column=0, row=0)0 [1 ?+ [6 `# v1 Q
  8. txt = Entry(window, width=10), q% M( F/ T3 }! {
  9. txt.grid(column=1, row=0)+ O+ A0 W; D2 y% W+ V9 i
  10. def clicked():
    9 ^7 S+ d. `3 N0 b1 u% N
  11.     lbl.configure(text="Button was clicked!")
    6 S2 f& Z/ w2 f! O; ?) Z
  12. 5 q# O- X( C- P2 G" i
  13. btn = Button(window, text="Click Me", command=clicked)
    1 j1 a, J& L- k% c% D( U
  14. btn.grid(column=2, row=0)2 B! |, j6 z- u8 w; F, i
  15. window.mainloop()
复制代码
9 `9 W- Y6 q5 w" C
7580-01-07.jpg 3 q" h' L: A* N. b* w, C
3 X, D; k' m* v1 w* w
此时点击按钮,标签组件内的内容没有变化,如何将文本框中输入的信息在标签组件中显示呢?9 z  s$ Y7 |4 S) c: U2 q
我们可以用get函数获取到文本框中输入的信息,然后如下更改clicked函数来设置窗口大小:
7 Q% P9 W- l" Y0 v% P
  1. def clicked():
    + }! z# v4 z7 s" M6 M9 u
  2.     res = "Welcome to " + txt.get()
    2 N& @8 G3 N* N
  3.     lbl.configure(text=res)
复制代码
如果我们在文本框中输入信息并点击按钮组件,标签组件将会显示Welcome to 文本框输入信息 。4 N. i8 Q5 k4 q
以下是完整代码:
" V! B/ H1 \4 g4 |) ?9 g/ Q% z
  1. from tkinter import *: n( L1 V# x! E2 f2 r
  2. ) k5 k2 r6 Y9 P/ j0 T, Z7 D0 Z7 E
  3. window = Tk()6 V5 W6 {( V7 W& H* N* d6 p
  4. window.title("First Window")8 j' a  {2 g7 H
  5. window.geometry("350x200")
    ) ~6 O# k1 Z/ b, N: M
  6. lbl = Label(window, text="Hello")
    + S# k0 N& P8 A. l6 X% L, h
  7. lbl.grid(column=0, row=0)% q* a0 j( |1 N; k7 b, T
  8. txt = Entry(window, width=10)' F. w9 z! o7 Z- @
  9. txt.grid(column=1, row=0): V% B! ?; n- b3 V1 q. r
  10. def clicked():
    7 f1 G" j0 U# z( S
  11.     res = "Welcome to " + txt.get()
    2 S" G9 _" `2 o+ w
  12.     lbl.configure(text=res)
      ]# Z! E  x1 M

  13. - G, a- d! u  ^6 P4 r0 U5 }# b
  14. btn = Button(window, text="Click Me", command=clicked)
    $ j5 Y* H  ?8 z) o7 \% H
  15. btn.grid(column=2, row=0)
    0 i. U! }8 M- r
  16. window.mainloop()
复制代码
运行结果为:
8 F' f0 I) A7 B3 @但每次我们运行代码后,我们都需要通过点击文本框来设置输入焦点才能输入信息,有什么办法可以自动设置输入焦点吗?
) y- l5 A8 r+ ^9 k1 j( o3 x: P5 r% a2 S: d  _  L" _
设置输入焦点- Y* y6 f% Z) j# B6 T
很简单,我们只需要调用focus函数来设置窗口大小:
) E; ?$ a4 M6 c' P: K1 r  l
  1. txt.focus()
复制代码
当我们运行代码后,会发现可以直接在文本框中输入信息而不需要点击文本框。
) D% g, L# q$ d/ c; X; M7 K  [  i% C% U! u0 U2 p! F9 I
添加一个组合框& P! j* A/ w- Q
为了添加一个组合框,可以使用Combobox类:  S6 b) W5 V: X5 e/ i( L
  1. from tkinter.ttk import *- I7 A4 @: X4 P
  2. combo = Combobox(window)
复制代码
然后可以给组合框添加一些值。
0 P6 \' [5 _- {
  1. from tkinter import *+ o% n/ L0 F9 ^; j: f
  2. from tkinter.ttk import *
    4 a, k* ]+ i- d6 \/ K
  3. ) ?5 @( D4 \0 R
  4. window = Tk()4 W4 v7 P" r! F0 ^$ \8 q' I8 q
  5. window.title("First Window")
    + O2 G* v5 Q$ o
  6. window.geometry("350x200")
    ( y  i- d6 X! ~% k! a8 T: J
  7. combo = Combobox(window)# @9 d5 L0 w0 V, ~3 _
  8. combo['values'] = (1,2,3,4,5,"Text")2 L; \8 ~3 U: A0 N# `2 q, [
  9. combo.current(1)
    % m4 l5 {  ]; Y" }9 l8 V
  10. combo.grid(column=0, row=0)6 \5 {; B( D8 t& }- A
  11. window.mainloop()
复制代码
我们可以用元组设置组合框选项。, H* ?7 P4 t9 v; ]+ ], M. Q
我们可以通过传递期望被选中选项的索引给current函数用以设置被选中的选项。' m- V- a& @! _: G3 N9 y
我们可以通过get函数获取到被选中的选项。
$ z0 ?; D. W* d% G' y7 b+ l& |3 G; W
  1. combo.get()
复制代码
( U$ D8 s( u1 o; Q- `2 H' k5 B
添加复选框
) J* M; r% w2 _, ^0 Y我们可以用Checkbutton类来创建一个复选框组件:
  Q8 K) ~0 _" [+ [6 h
  1. chk = Checkbutton(window, text="Choose")
复制代码
能通过传递值设置复选框的状态:
2 `/ F) ~! ]3 N( e! y
  1. from tkinter import *6 Y6 m! u  e; e- o# d5 K
  2. from tkinter.ttk import *
    1 |$ w3 \! X1 X5 m5 g
  3. , e: A3 s1 E* Z8 ^- D
  4. window = Tk()
    . r3 u8 @) @& H; |/ O0 t; m
  5. window.title("First Window")  `9 z+ A1 g% X* A8 O% o6 Z
  6. window.geometry("350x200")
    ( v" A5 U, x4 u+ N) `8 D
  7. chk_state = BooleanVar()
    8 ]+ P" ~7 x5 m9 h2 h7 ?" x7 E
  8. chk_state.set(True) # Set check state
    1 B# ?4 I. U8 N) e, q
  9. chk = Checkbutton(window, text="Choose", var=chk_state)
    / W7 O0 ~4 }2 F5 Y- s7 g/ o
  10. chk.grid(column=0, row=0)
    1 E+ T% u3 f# h+ [7 k! P6 O
  11. window.mainloop()
复制代码
上例我们用的是BooleanVar变量用来设置复选框的状态,也可以使用IntVar变量进行设置。) y6 R/ K  s5 e9 K' J5 z
  1. chk_state = IntVar()/ h" A: T  Z, ~, n
  2. chk_state.set(1) # Check$ M& V' Q, M9 \2 j3 Y; E
  3. chk_state.set(0) # Uncheck
复制代码
结果和用BooleanVar一样。* v; r; A# T+ A3 ~
( S: b3 K, O: u9 y+ z# O5 x/ R
添加单选框
- |  R; d- y! O  F添加单选框可以用Radiobutton类创建一个文本框:
8 `# \0 Z8 y. @
  1. rad1 = Radiobutton(window, text="First", value=1)
复制代码
我们需要给每个单选框设置不同的值,否则会不起作用。) O3 E  C$ j4 `; |* L
  1. from tkinter import *
    3 w3 J: {; d5 J, b% N
  2. from tkinter.ttk import *
    - n! T; S( o$ t

  3. * a4 A% H* x: m7 U
  4. window = Tk()
    7 r$ v7 G( j( A3 }3 E/ n6 ]
  5. window.title("First Window")6 v2 t3 @2 N6 Q% V$ P
  6. window.geometry("350x200")5 R9 F! X3 H7 S+ `- s
  7. rad1 = Radiobutton(window, text="First", value=1)- N5 b& p1 E9 d
  8. rad2 = Radiobutton(window, text="Second", value=2)* ~! F* D! w) L. x/ O4 l
  9. rad3 = Radiobutton(window, text="Third", value=3)
    ' `% W! ~- z/ c( c* |* G
  10. rad1.grid(column=0, row=0)6 F: _9 u( A6 ^3 n0 c
  11. rad2.grid(column=1, row=0)+ `1 Y& Z4 c# i
  12. rad3.grid(column=2, row=0)" O. O& }, T% s) Y
  13. window.mainloop()
复制代码
当然,我们可以给这些单选框设置command参数指定一个函数,当用户点击它们时就会运行该函数。% f- I  @5 j/ Q
  1. rad1 = Radiobutton(window, text="First", value=1, command=clicked)
复制代码
  1. def clicked():
    ) |  q' ?% c$ v% {  ?5 I) `8 \2 C
  2.     # Do what you need
    & P9 `2 T; }4 N) z2 C( |6 b( u+ E
  3.     pass
复制代码

8 m, j, R. X7 n% Y( v3 n% y' e( w% b获取单选框值0 P, a7 h( z; b! a1 s; {* }
为获取到选中单选框的值,我们可以将IntVar变量传给单选框的variable参数,之后用IntVar变量的get函数就可以获取到其值啦!0 Q8 |4 f. B* E9 M2 x& Z% i
  1. from tkinter import *  I& h( z5 Q' i6 h. {2 \
  2. from tkinter.ttk import *$ A7 C/ r2 @2 V4 o: s
  3. . y# ^0 \, F' G; K9 N8 k. O
  4. window = Tk()
    ; Z, W+ ~+ S: n! Y% A$ Y! t
  5. window.title("First Window")0 f" Q1 O- \& Y
  6. selected = IntVar()
    ) H8 X/ ]& t& K0 O
  7. lbl = Label(window, text="Show Value")1 l; c8 R* F! s( f* g
  8. rad1 = Radiobutton(window, text="First", value=1, variable=selected)
    % A: T) I0 ^: T( y
  9. rad2 = Radiobutton(window, text="Second", value=2, variable=selected)
    0 c. I; z  d9 a$ e2 ]
  10. rad3 = Radiobutton(window, text="Third", value=3, variable=selected)! z$ t& {! f/ b1 U: P, v. s
  11. def clicked():
    $ }( l) w4 E! K; ^) q5 M
  12.     lbl.configure(text=selected.get())
    + j; e. [: X2 o4 S4 d; H2 r- I: O
  13. btn = Button(window, text="Click Me", command=clicked)
    , @2 ]* H/ L' ?% z! N/ A( a& t
  14. rad1.grid(column=0, row=0)
    " A& [1 A  C' l' U
  15. rad2.grid(column=1, row=0)
    ' E) s7 z% c8 x, _4 M, J+ r8 r6 U; O
  16. rad3.grid(column=2, row=0)
    % R# ^/ z% f" s- ^8 d1 [
  17. btn.grid(column=4, row=0)4 s' z9 a, k. V, d# ?' h  O8 A
  18. lbl.grid(column=0, row=1)
    2 F, |* I4 B" c7 H6 u
  19. window.mainloop()
复制代码
每次我们选中一个单选框,并点击按钮,标签框中就会显示其值:( K" O, z! Q1 Y% u% t
7580-01-10.jpg : B( H% j! R# D$ A2 |1 ^
# i: I2 {" d' w/ l0 d5 S- {
添加文本区
& r: |; V1 p3 d) K6 ?添加文本区可以用ScrolledText类创建一个文本框:
! i: L3 E/ U. \) K, j- \& u
  1. from tkinter import scrolledtext
    + W: t4 U- l6 ?4 q  D
  2. txt = scrolledtext.ScrolledText(window, width=40, height=10)
复制代码
我们需要指定一个文本区的宽度和高度,否则它会占住整个窗口:( [- N( I' l  J0 [, ~5 s( g% B
用以下方法可以在文本区中插入文本:
9 `& L, l/ B2 b2 H! G8 A( Q
  1. txt.insert(INSERT, "Text goes here")
复制代码
用以下方法可以将文本区中的文本删除:; g9 C: L) A: L. ~0 b' T/ q
  1. txt.delete(1.0, END)
复制代码
4 h. x4 D' u% W5 b, D
创建消息框$ w) S* q( S' B0 q/ y
我们可以按如下方式创建一个消息框:5 z. P* K/ ^# P/ o' K: z
  1. from tkinter import messagebox
    7 |, P* T! x; j; X
  2. messagebox.showinfo("Message title", "Message content")
复制代码
我们创建一个按钮,当它被点击时显示一个消息框:
  |% i$ o+ a$ _
  1. from tkinter import *1 j' H, Z# X+ L* b
  2. from tkinter import messagebox* ~/ N# `7 K3 j/ Y' D
  3. : }- F! Q% x8 p( V5 O9 u+ i+ w
  4. window = Tk()
    9 F; Z# C  k9 n5 L
  5. window.title("First Window")# \- l4 Y' |; o& F
  6. window.geometry("350x200")
    9 }' D5 |4 I3 a4 Y3 u2 E9 ~$ C
  7. def clicked():- O, i, h$ o4 J5 Z; d) m8 [9 L
  8.     messagebox.showinfo("Message title", "Message content")
    , Q  u' N0 |2 ~+ P/ f
  9. btn = Button(window, text="Click here", command=clicked)
    ; @% ]$ X) }: D; t6 o
  10. btn.grid(column=0, row=0)9 E' u6 a, E( f* [0 x! o$ w" k$ ~
  11. window.mainloop()
复制代码

4 c* z: @$ J$ X. u添加Spinbox
, Y5 v7 z# j; l7 bSpinbox是输入控件;与Entry类似,但是可以指定输入范围值。
# r# @5 @; r. p# U4 t
  1. spin = Spinbox(window, from_=0, to=100)
复制代码
通过from_和to参数指定范围,也可以用width参数指定控件宽度。
% P3 b, [" e' z! W1 D# L2 f
  1. from tkinter import *( R1 C. H  w8 Y; K* h4 S7 S; Y

  2. 4 {; i' d! B, y0 @8 ^* B$ u
  3. window = Tk()
    ( a$ d: W, C$ q6 S. ?+ k" ]
  4. window.title("First Window")& F# L' ]+ x1 B  j
  5. window.geometry("350x200")( N3 W$ d" l& o4 J9 S; J
  6. spin = Spinbox(window, from_=0, to=100, width=5). c# {: a4 x. o5 ^2 S& Y6 Z. B
  7. spin.grid(column=0, row=0)7 s! f: K+ |# R2 |4 M" R
  8. window.mainloop()
复制代码
也可以指定某些特定的值,而不是整个范围:$ R. V3 Y/ X, v( ]  [, e
  1. from tkinter import *
    8 L: C# s8 y# D1 N# p- l1 ?" U
  2. 6 Q! J: N( c. y, V3 C( A
  3. window = Tk()
    5 X) h0 {0 ?  \0 k: E( ]" _) H6 \
  4. window.title("First Window")+ `; @# r8 i2 b. s, W
  5. window.geometry("350x200")$ h' v% g! S5 s( K/ j
  6. spin = Spinbox(window, values=(3,8,11), width=5)# b$ ]& N+ {- C0 u9 e  |; E8 l7 |7 o
  7. spin.grid(column=0, row=0)
    8 S. I( f0 f+ y
  8. window.mainloop()
复制代码
这样,Spinbox控件就只会显示3个数字即3,8,11。! H6 y  t" p% r1 I% }' l$ F
可以用如下方式给Spinbox控件设置默认值:3 s1 p- U& L! ^, l, U9 I
  1. var = IntVar()
    8 J  ]% d  Y1 L; |! f, e
  2. var.set(36)8 e7 y( @5 R3 G( o& K3 I- m
  3. spin = Spinbox(window, from_=0, to=100, width=5, textvariable=var)
复制代码
运行代码就可以看到36作为Spinbox控件的默认值显示了。
* ?" |. x8 F1 J6 ~添加进度条
6 ^2 G+ o" V( t  {
我们可以用Progressbar类创建进度条:
# Q- Y; I$ `3 W. E+ I; p
  1. from tkinter.ttk import Progressbar' q. o0 \: I! \9 Z. ^* i+ }' |
  2. bar = Progressbar(window, length=200)
复制代码
设置一下进度条的值:+ l( G# E5 F0 i- ~# `% L& F
  1. bar['value'] = 70
复制代码
改变进度条的颜色可以按如下步骤进行:, G. X& ?8 l; n( @4 c: [
  1. from tkinter import *
    # I4 G# C( P6 w
  2. from tkinter.ttk import Progressbar
    + r/ k' g" E4 m0 L& r8 N# w
  3. from tkinter import ttk
    4 F( ]6 Y, \6 a. D
  4. window = Tk()
    7 L# M. |, n5 M1 s
  5. window.title("First Window")
    ; N  b* x1 k' B7 A0 \* y4 w- ]0 [
  6. window.geometry('350x200')
    4 N6 ]8 ~# }% P% u' c9 z/ t
  7. style = ttk.Style()
    4 O6 s+ D/ A; Y: a1 a& ^
  8. style.theme_use('default')% Y' u3 h% p& f* P& z
  9. style.configure("black.Horizontal.TProgressbar", background='black')
    & ]: }6 ^3 Y8 r
  10. bar = Progressbar(window, length=200, style='black.Horizontal.TProgressbar')
    0 [- e& C, b( e
  11. bar['value'] = 70
    . [4 s. u" ~+ ^: y; {
  12. bar.grid(column=0, row=0)
    , ~3 @: \" S6 F) q+ d6 A
  13. window.mainloop()
复制代码

2 H# b! W# G- x5 e) \添加文件对话框4 _, s( ^$ j3 J9 W/ W/ @
我们可以按如下方式创建一个文件对话框:
. r9 U9 ?3 w! |1 k
  1. from tkinter import filedialog2 \7 o2 x* q) h
  2. file = filedialog.askopenfilename()
复制代码
当你选择一个文件并点击打开,file变量将会保存该文件的路径。
) J" i4 N% C- b" z0 H* o$ I如果想一次选择多个文件并打开,我们可以用:) W, h4 y( l" `3 |
  1. files = filedialog.askopenfilenames()
复制代码
用filetypes参数指定文件对话框的文件类型,只需在元组中指定扩展名即可。
2 \8 z2 W0 D. N; N+ @
  1. file = filedialog.askopenfilename(filetypes = (("Text files","*.txt"),("all files","*.*")))
复制代码
askdirectory函数可以让我们请求目录:
3 ?6 l# R2 \0 w" }, M+ e
  1. dir = filedialog.askdirectory()
复制代码
可以用initialdir参数指定打开的初始目录:
! Q3 u4 M- x3 d
  1. from tkinter import *
    8 D, K* u1 D* J
  2. from tkinter import filedialog
    * }7 P5 j8 h, Y- s- I% i1 r
  3. import os
    0 ~' r3 y" Z2 p+ p2 f4 g& l$ k+ `7 Z

  4. 5 n) Y8 c% g1 b1 o9 a  z9 x1 S8 C
  5. window = Tk()
    1 ]( ~& M! n  N1 V
  6. window.title("First Window")
    0 _5 L) Q9 `+ D# O2 ]
  7. window.geometry('350x200')1 K; }$ e0 R1 T8 Y9 b0 K$ `
  8. def clicked():/ @4 M! q5 `# o0 j/ {
  9.     file = filedialog.askopenfilenames(initialdir=os.path.dirname(__file__))* s9 c% c' K; q5 v5 u
  10. btn = Button(window, text="Click Me", command=clicked)- g% o; c: J' t& N1 x4 w
  11. btn.grid(column=0, row=0)# D  z- i# |$ L; m0 S$ M) o1 C
  12. window.mainloop()
复制代码
, m  U' V6 @' Y3 y; C6 l, P
新大榭Python学习社区公益培训、Excel业务指导、办公软件定制、网站建设、网络安全;新大榭Web实验室欢迎您!http://lab.daxie.net.cn/
Q群推荐 大榭本地求职招聘QQ群,欢迎转发分享本地招聘信息资讯! 官方招聘1群(已满);官方招聘2群:315816937 *
 楼主| 发表于 2021-9-23 09:54:40 | 显示全部楼层
画图案例演示:画个机器猫玩玩,呵呵~& r* r* o8 z- H0 E6 X6 Y
: W% {6 F/ U" D- j
7580-02-01.jpg
8 d9 x3 j7 g* F( H. C6 U( a5 W3 P; P; G) n) N1 H+ C: [
源代码如下:" ^0 W; ]1 [: o9 g# O- F+ F
  1. from tkinter import *7 {. E; M' s- k5 H
  2. 6 P, l# j. n6 R7 T7 G: p9 P; w
  3. root = Tk()
    / a" l- q, b, U  |

  4. ) h0 M3 f2 f- R4 k$ _7 A
  5. #画板
    ! c, x. s6 G2 O" c. p0 G
  6. paint = Canvas(root, width=600, height=600, background="white"). h# a! z- J( B7 H) H3 U  X
  7. paint.pack()
    ) }, k! v0 \" z% S
  8. 4 h: ~, n7 k' u, L$ `
  9. #头
    ' }5 b1 X' `8 K/ x7 ?
  10. paint.create_oval(175, 100, 425, 350, fill="#1E90FF")1 M6 \0 Y  ]2 X' e9 P5 B, w

  11. 0 |. E  j: X' ]5 K/ b5 |5 M5 F
  12. #脸# m9 r; ^9 j% m/ A' F4 w
  13. paint.create_oval(200, 150, 400, 350, fill="white")) q7 l4 h' r) r9 c1 s$ u
  14. ( c- ~! K. ~! f
  15. #眼睛( h$ c& y; t% ~
  16. paint.create_oval(250, 120, 300, 180, fill="white") # `& {4 Z' A- L( d' `# }# [
  17. paint.create_oval(300, 120, 350, 180, fill="white")
    / d4 T& }$ B5 l, o* I2 q' i: C+ O, x
  18. paint.create_oval(280, 140, 295, 160, fill="black")
    % _& v2 s5 l, O: d9 W
  19. paint.create_oval(305, 140, 320, 160, fill="black")5 x& J' H* B! n+ j# l
  20. paint.create_oval(285, 145, 290, 155, fill="white")
    ; s' G2 G5 s. v
  21. paint.create_oval(310, 145, 315, 155, fill="white")
    ' W6 Q4 G1 x3 q# t( _

  22. 2 V: t; Z6 x' R' N7 r
  23. #鼻子
    : d5 J- C, F: ]; V/ J
  24. paint.create_oval(290, 167, 310, 189, fill="red")
    ( A* H" s- M5 B  f# C; E
  25. paint.create_line(300, 190, 300, 270, fill="black")
    % j' A- _6 i8 s" L

  26. - U' I9 P! m& X# S- |
  27. #嘴巴( `: \! N" n8 s9 P( P; }
  28. paint.create_arc(240, 230, 360, 270, style=ARC, extent=-180)  u' u) `4 S  I# A

  29. $ W; K" P2 L7 S. q
  30. #右边胡子2 t2 ?' F, l8 {! \& V
  31. paint.create_line(320, 210, 380, 185)
    - k, n" v  v  r- o) o& G
  32. paint.create_line(320, 220, 385, 220)* S2 F! X, f& s! ~& B) P
  33. paint.create_line(320, 230, 380, 250)
    " U2 D0 b/ b$ b' a
  34. / f$ m# f3 ~+ m8 K# q6 C
  35. #左边胡子
    + q1 O* ^; `" [0 N( i
  36. paint.create_line(280, 210, 220, 185)0 j! ]. {4 [; [* W
  37. paint.create_line(215, 220, 280, 220)
    5 b. R+ I: G4 ^
  38. paint.create_line(220, 250, 280, 230)9 }, y, t  ]& f% v5 ^9 y/ v, U) t5 [  v
  39.   F5 l: A) ^. u! k6 \) S
  40. #身体' X8 D5 p' M. T/ H7 L. I
  41. paint.create_rectangle(200, 300, 400, 485, fill="#1E90FF")4 b# {2 Z) f$ Z' V

  42. 6 e& j% i: E5 B) i. ]
  43. #肚子
    2 Z4 v# h( _& T$ C
  44. paint.create_oval(230, 285, 370, 425, fill="white")4 b- c% N8 H& b" g1 ?. b
  45. paint.create_arc(230, 285, 370, 425, outline="white", width=2," W: k# v1 _  b8 G! T% ]
  46.                  start=54, extent=73, style=ARC)
    $ F$ k/ \% i: j' Q
  47. $ n/ O* E3 W! @! p/ x' a1 A
  48. #项圈5 Y' K, l! Y0 Z& z$ Q
  49. paint.create_line(200, 300, 400, 300, capstyle=ROUND, width=15, fill="red")
    8 B4 j/ _0 M- T/ K' U" n6 ?) D* P. `

  50. : g! ?3 g% N" _  f, @! Q, @
  51. #铃铛& f. y5 {; z1 Q" d- w9 F2 ^# U
  52. paint.create_oval(285, 300, 317, 332, fill="yellow")2 H3 V/ @2 N4 r* G% C! f; Q# L0 }: {
  53. paint.create_line(286, 312, 316, 312, capstyle=ROUND)* S4 J4 Z: B* M4 x4 r* f' |
  54. paint.create_line(285, 316, 316, 316, capstyle=ROUND), e' Q3 f0 Q+ ^7 P- b' |+ E; K. W
  55. paint.create_oval(295, 320, 305, 328, fill="red")# j9 K- q( s* v( d
  56. paint.create_line(300, 327, 300, 332)
    : r0 S. y: F7 v: ]7 `, Y

  57. ( K6 L& o0 Q& \4 h6 n* K, k+ i, F
  58. #口袋9 y* {7 e8 p4 X
  59. paint.create_arc(246, 300, 354, 410, extent=-180)  f4 l% i9 d7 Q6 G5 |2 H1 f

  60. 0 L- d: R" H% ]+ t  w( e4 i
  61. #脚9 f: q4 x  c& W7 c( V& I
  62. paint.create_arc(280, 465, 322, 504, extent=180,fill="white", outline="white")
    * h' ?/ p9 @0 g7 U: ^* X
  63. paint.create_oval(190, 470, 290, 500, fill="white")
    6 }( u: r6 }* O- [% p. Z9 j
  64. paint.create_oval(310, 470, 410, 500, fill="white")2 e- G: O# e3 N9 m% r% r* w
  65. % g' H! `) r2 w9 i& Q9 t" i( A
  66. #左手7 o2 v; h6 z2 _9 t3 k2 h
  67. lpoints = [200, 306,' J  ^0 K$ w2 N
  68.            125, 365,
    , W, x, U. R* Z* I+ t- n8 B$ L
  69.            145, 395,
    $ d- T8 K! y! n
  70.            200, 372]' ~7 c7 M1 K+ S# w/ w
  71. paint.create_polygon(lpoints, fill="#1E90FF")3 u5 l# u+ Z* f) O9 v
  72. paint.create_oval(114, 356, 160, 402, fill="white")
    0 b7 i/ Q# W! f, S7 A3 C8 |

  73. : @8 \2 ~2 [3 V& q
  74. #右手- n, `( y& p; F* a! b9 y
  75. rpoints = [401, 306,
    2 `3 F- d7 E- [& K" t& t
  76.            477, 365,
    0 k$ S! |5 Y( ?  A8 P. Q# u: G& |
  77.            445, 395,/ a' h$ e, p7 L# K
  78.            401, 372]& m9 ~) t/ _- _  V! F( a
  79. paint.create_polygon(rpoints, fill="#1E90FF")
      v5 q! M- N. F4 m
  80. paint.create_oval(440, 355, 487, 402, fill="white")9 |; t& r) A7 E. \* i" ], P* [

  81. ' V- b( @  e: _# X
  82. mainloop()
复制代码

7580-02-01:机器猫.zip

30.98 KB, 阅读权限: 10, 下载次数: 0

新大榭Python学习社区公益培训、Excel业务指导、办公软件定制、网站建设、网络安全;新大榭Web实验室欢迎您!http://lab.daxie.net.cn/
新大榭官方公益帮帮群:6603298 官方Excel学习交流群:82064486  欢迎您加入
您需要登录后才可以回帖 登录 | 注册

本版积分规则

新大榭七周年,感谢由您!

文字版|小黑屋|新大榭 ( 浙ICP备16018253号-1 )|点击这里给站长发消息|

GMT+8, 2024-5-19 16:54 , Processed in 0.074417 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表