zoukankan      html  css  js  c++  java
  • Python基础之用tkinter写界面

    参考链接:https://blog.csdn.net/qq_37482202/article/details/84201259

    Tkinter介绍

    Tkinter(也叫Tk接口)是Tk图形用户界面工具包标准的Python接口。Tk是一个轻量级的跨平台图形用户界面(GUI)开发工具。Tk和Tkinter可以运行在大多数的Unix平台、Windows、和Macintosh系统。

    Tkinter由一定数量的模块组成。Tkinter位于一个名为_tkinter(较早的版本名为tkinter)的二进制模块中。Tkinter包含了对Tk的低级接口模块,低级接口并不会被应用级程序员直接使用,通常是一个共享库(或DLL),但是在一些情况下它也被Python解释器静态链接。

    导入库:

    1 from tkinter import *
    2 from tkinter.tix import Tk, Control, ComboBox  # 升级的组合控件包

    在进行界面绘制之前需要初始化Tk()

    root = Tk()  # 初始化tk

    root便是布局的根节点了,以后的布局都在它之上

    1     # 设置窗口标题
    2     root.title("hello tkinter")
    3     # 设置窗口大小 注意:是X 不是*
    4     root.geometry("1024x768")
    5     # 设置窗口是否可以变化长/宽,False不可变,True可变
    6     root.resizable(width=True, height=True)
    7     # 引入升级包,这样才能使用升级的组合控件
    8     root.tk.eval('package require Tix')

    接下来会设置窗口的属性。

    1. Label

    1     activebackground, activeforeground, anchor, 
    2     background, bitmap, borderwidth, cursor, 
    3     disabledforeground, font, foreground, 
    4     highlightbackground, highlightcolor, 
    5     hightlightthickness, image, justify, 
    6     padx, pady, relief, takefocus, text, 
    7     textvariable, underline, wraplength, 
    8     height, state, width

    属性很多,说一下常用的属性

    1     lable = Label(root, text="label", bg="pink", bd=10, font=("Arial", 12), width=8, height=3)
    2     lable.pack(side=LEFT)
    第一个 要依附的节点
    text 上面显示的字
    bg 背景颜色 也可以传rgb16进制的形式
    bd 边框宽度
    font 字体 第一个是字体样式 第二个是字体大小
    width height 宽 高
    bitmap 图像
    highlightcolor 高亮时字体颜色
    highlightbackground 高亮时背景颜色
    textvariable 绑定的变量 之后如果变量值发生变动 字也会随之改变
    wraplength 换行控制 如果是50就表示宽度到50就换行显示

    最后你需要调用pack()来把控件布置上去,你可以指定布局方式,可定义的属性也非常多

      1 # Booleans
      2 NO=FALSE=OFF=0
      3 YES=TRUE=ON=1
      4  
      5 # -anchor and -sticky
      6 N='n'
      7 S='s'
      8 W='w'
      9 E='e'
     10 NW='nw'
     11 SW='sw'
     12 NE='ne'
     13 SE='se'
     14 NS='ns'
     15 EW='ew'
     16 NSEW='nsew'
     17 CENTER='center'
     18  
     19 # -fill
     20 NONE='none'
     21 X='x'
     22 Y='y'
     23 BOTH='both'
     24  
     25 # -side
     26 LEFT='left'
     27 TOP='top'
     28 RIGHT='right'
     29 BOTTOM='bottom'
     30  
     31 # -relief
     32 RAISED='raised'
     33 SUNKEN='sunken'
     34 FLAT='flat'
     35 RIDGE='ridge'
     36 GROOVE='groove'
     37 SOLID = 'solid'
     38  
     39 # -orient
     40 HORIZONTAL='horizontal'
     41 VERTICAL='vertical'
     42  
     43 # -tabs
     44 NUMERIC='numeric'
     45  
     46 # -wrap
     47 CHAR='char'
     48 WORD='word'
     49  
     50 # -align
     51 BASELINE='baseline'
     52  
     53 # -bordermode
     54 INSIDE='inside'
     55 OUTSIDE='outside'
     56  
     57 # Special tags, marks and insert positions
     58 SEL='sel'
     59 SEL_FIRST='sel.first'
     60 SEL_LAST='sel.last'
     61 END='end'
     62 INSERT='insert'
     63 CURRENT='current'
     64 ANCHOR='anchor'
     65 ALL='all' # e.g. Canvas.delete(ALL)
     66  
     67 # Text widget and button states
     68 NORMAL='normal'
     69 DISABLED='disabled'
     70 ACTIVE='active'
     71 # Canvas state
     72 HIDDEN='hidden'
     73  
     74 # Menu item types
     75 CASCADE='cascade'
     76 CHECKBUTTON='checkbutton'
     77 COMMAND='command'
     78 RADIOBUTTON='radiobutton'
     79 SEPARATOR='separator'
     80  
     81 # Selection modes for list boxes
     82 SINGLE='single'
     83 BROWSE='browse'
     84 MULTIPLE='multiple'
     85 EXTENDED='extended'
     86  
     87 # Activestyle for list boxes
     88 # NONE='none' is also valid
     89 DOTBOX='dotbox'
     90 UNDERLINE='underline'
     91  
     92 # Various canvas styles
     93 PIESLICE='pieslice'
     94 CHORD='chord'
     95 ARC='arc'
     96 FIRST='first'
     97 LAST='last'
     98 BUTT='butt'
     99 PROJECTING='projecting'
    100 ROUND='round'
    101 BEVEL='bevel'
    102 MITER='miter'
    103  
    104 # Arguments to xview/yview
    105 MOVETO='moveto'
    106 SCROLL='scroll'
    107 UNITS='units'
    108 PAGES='pages'

    写完这些运行程序还是无法出现界面,那是因为还少了一句

    root.mainloop()

    2. Button

    1     """
    2     command: 点击调用的方法
    3     activeforeground: 点击时按钮上字的颜色
    4     activebackground: 点击时按钮的背景颜色
    5     """
    6     button = Button(root, text='QUIT', command=root.quit, activeforeground="black", activebackground='blue', bg='red',
    7                     fg='white')
    8     button.pack(fill=Y, expand=1)

    3. Scale: 滑动条

     1 def resize(ev=None):
     2     lable.config(font='Helvetica -%d bold' % scale.get())
     3 
     4 # 滑动条
     5 """
     6 from_: 滑动条起始值
     7 to: 滑动条终点值
     8 origent: 样式 两种样式 一横一竖
     9 """
    10 scale = Scale(root, from_=10, to=40, orient=HORIZONTAL, command=resize)
    11 scale.set(12)
    12 scale.pack()

    和button不同的是command不再是点击事件了而是拖动事件,调用set()方法可以设置当前位置

    4. NumberericUpDown: 数字选择框

     1     # 数字选择框
     2     """
     3     integer: 是否为整数
     4     max: 最大值
     5     min: 最小值
     6     value: 初始值
     7     step: 步长
     8     """
     9     ct = Control(root, label='Number:', integer=True, max=12, min=2, value=2, step=2)
    10     ct.label.config(font='Helvetica 14 bold')
    11     ct.pack()

    5. ComboBox: 下拉选择框

     1     # 下拉选择框
     2     """
     3     label: 前面要显示的字
     4     editable: 控制是否可更改
     5     insert(): 给下拉选择框添加选项
     6     """
     7     cb = ComboBox(root, label='Type:', editable=True)
     8     for animal in ('dog', 'cat', 'hamster', 'python'):
     9         cb.insert(END, animal)
    10     cb.pack()

    6. Menu: 菜单

     1     # 菜单选项
     2     menubar = Menu(root)
     3     root.config(menu=menubar)
     4     filemenu = Menu(menubar, tearoff=0)
     5     # 给menu添加一个选项
     6     menubar.add_cascade(label='文件', menu=filemenu)
     7     # 添加子选项
     8     filemenu.add_command(label='新建...', command=click())
     9     filemenu.add_command(label='打开...', command=click())
    10     filemenu.add_command(label='保存...', command=click())
    11     filemenu.add_command(label='关闭填写...', command=root.quit)

    7. Frame

    1     # frame相当于一个局部的窗体,可以用来装载其他控件
    2     frame1 = Frame(root)
    3     frame1.pack(fill=X)
    4     label1 = Label(frame1, text='您的花名:')
    5     label1.grid(row=1, column=0)

    使用grid能让你更容易把握控件的位置,你可以指定它出现在几行几列,是否跨行跨列,跨几行等等

    8. Radiobutton: 单选框

     1     # 单选框
     2     frame2 = Frame(root)
     3     frame2.pack(fill=X)
     4     label2 = Label(frame2, text='您的性别:')
     5     label2.grid(row=1, column=0)
     6     sex = StringVar()
     7     sex_male = Radiobutton(frame2, text='', fg='blue', variable=sex, value='')
     8     sex_male.grid(row=1, column=2)
     9     sex_female = Radiobutton(frame2, text='', fg='red', variable=sex, value='')
    10     sex_female.grid(row=1, column=4)

    这个单选框写出来,刚开始男和女两个单选框都是选中状态,不过,你拿鼠标单击一下,就可以正常的单选状态了。

    9. ListBox: 列表

     1     # 列表
     2     frame4 = Frame(root)
     3     frame4.pack(fill=X)
     4     label4 = Label(frame4, text='4、请删除您不会的变成语言:')
     5     label4.grid(row=1, column=0)
     6     listbox = Listbox(frame4)
     7     listbox.grid(row=1, column=1)
     8     for item in ["C", "C++", "JAVA", "PYTHON", "R", "SQL", "JS"]:
     9         listbox.insert(END, item)
    10 
    11     DELETE = Button(frame4, text='删除', command=lambda listbox=listbox: listbox.delete(ANCHOR))
    12     DELETE.grid(row=1, column=2)
    13     language = Button(frame4, text='确定')
    14     language.grid(row=2, column=1)

    这里按钮点击事件的写法使用lambda表达式写的,用法可以自行百度

    10. Canvas: 画板

     1 from tkinter import *
     2 
     3 
     4 class CanvasDemo:
     5     def __init__(self):
     6         window = Tk()
     7         window.title("CanvasDemo")
     8 
     9         self.canvas = Canvas(window, width=200, height=100, bg="White")
    10         self.canvas.pack()
    11 
    12         frame = Frame(window)
    13         frame.pack()
    14 
    15         btRectangle = Button(frame, text="长方形", command=self.displayRect)
    16         btOval = Button(frame, text="椭 圆", command=self.displayOval)
    17         btArc = Button(frame, text="圆 弧", command=self.displayArc)
    18         btPolygon = Button(frame, text="多边形", command=self.displayPolygon)
    19         btLine = Button(frame, text=" 线 ", command=self.displayLine)
    20         btString = Button(frame, text="文 字", command=self.displayString)
    21         btClear = Button(frame, text="清 空", command=self.clearCanvas)
    22 
    23         btRectangle.grid(row=1, column=1)
    24         btOval.grid(row=1, column=2)
    25         btArc.grid(row=1, column=3)
    26         btPolygon.grid(row=1, column=4)
    27         btLine.grid(row=1, column=5)
    28         btString.grid(row=1, column=6)
    29         btClear.grid(row=1, column=7)
    30 
    31         window.mainloop()
    32 
    33     def displayRect(self):
    34         self.canvas.create_rectangle(10, 10, 190, 90, tags="rect")
    35 
    36     def displayOval(self):
    37         self.canvas.create_oval(10, 10, 190, 90, tags="oval", fill="red")
    38 
    39     def displayArc(self):
    40         self.canvas.create_arc(10, 10, 190, 90, start=-90, extent=90, width=5, fill="red", tags="arc")
    41 
    42     def displayPolygon(self):
    43         self.canvas.create_polygon(10, 10, 190, 90, 30, 50, tags="polygon")
    44 
    45     def displayLine(self):
    46         self.canvas.create_line(10, 10, 190, 90, fill='red', tags="line")
    47         self.canvas.create_line(10, 90, 190, 10, width=9, arrow="last", activefill="blue", tags="line")
    48 
    49     def displayString(self):
    50         self.canvas.create_text(60, 40, text="Hi,i am a string", font="Tine 10 bold underline", tags="string")
    51 
    52     def clearCanvas(self):
    53         self.canvas.delete("rect", "oval", "arc", "polygon", "line", "string")
    54 
    55 
    56 CanvasDemo()

    11. CheckButton: 多选框

    1     # 多选框,onvalue代表被勾选时的值,offvalue代表不被勾选时的值
    2     frame8 = Frame(root)
    3     frame8.pack()
    4     agree = StringVar()
    5     agree = Checkbutton(frame8, text='我同意', variable=agree, onvalue='确定', offvalue='不确定',)
    6     agree.grid()

    12. LabelFrame: 容器框

    1     # 容器框
    2     frame10 = Frame(root)
    3     frame10.pack()
    4     group = LabelFrame(frame10, text='特别鸣谢', padx=5, pady=5)
    5     group.grid()
    6     w = Label(group, text='容器框')
    7     w.pack()

    这些差不多够用了。

  • 相关阅读:
    [LeetCode]String主题系列{第5,6题}
    [LeetCode]Math主题系列{第7,9,13,273题}
    [LeetCode]LinkedList主题系列{第2题}
    [LeetCode]HashTable主题系列{第3,36,49,94,136,138,187,202,204,205,290,347,389,409,438,451,463,500,508,560,594,599题}
    由于博客园的道路越来越像CSDN了,已经不再是当年的博客园了,决定退出博客园,后续建立自己的博客站点。
    Revit二次开发——非模态窗口的事件处理
    Revit二开---Schemachema扩展数据
    Revit二开---ViewFamily视图类型枚举
    CAD二开---扩展数据XData
    CAD二开---框选文字批量对齐
  • 原文地址:https://www.cnblogs.com/smart-zihan/p/12072825.html
Copyright © 2011-2022 走看看