Python GUI programming(tkinter)

python3之前的版本用Tkinter,之后用的是tkinter

最简单的使用Tkinter的代码,首先要Tk()建立一个窗口,然后加进各种Widget

from Tkinter import *
window = Tk()
label = Label(window, text = "Welcome to Python")
button = Button(window, text = "Click me")
label.pack()
button.pack()

window.mainloop()

Tkinter编程是基于事件驱动型的,当点击一个按键时,可以通过一个函数处理这个事件

from Tkinter import *

def processOK():
    print("OK")
def processCancel():
    print("Cancel")

window = Tk()
btOK = Button(window, text = "OK", fg = "red", command = processOK)
btCancel = Button(window, text = "Cancel", bg = "yellow", command = processCancel)
btOK.pack()
btCancel.pack()

window.mainloop()

其中参数command就是绑定的函数

还有各种可用的Widget Classes

  • Button
  • Canvas
  • Checkbutton
  • Entry
  • Frame
  • Label
  • Menu
  • Menubutton
  • Message
  • Radiobutton
  • Text

可以直接修改widget的某项属性:

btShowOrHide = Button(window, text = "Show", bg = "white")
btShowOrHide["text"] = "Hide"
btShowOrHide["bg"] = "red"
btShowOrHide["fg"] = "#AB84F9" # Change fg color to #AB84F9
btShowOrHide["cursor"] = "plus" # Change mouse cursor to plus
btShowOrHide["justify"] = LEFT # Set justify to LEFT

IntVar(), StringVar()

from Tkinter import *

class WidgetsDemo:
    def __init__(self):
        window = Tk()
        window.title('Widgets Demo')
        
        frame1 = Frame(window)
        frame1.pack()
        self.v1 = IntVar()
        self.v2 = IntVar()
        rbRed = Radiobutton(frame1, text = "Red", bg = "red", variable = self.v2, value = 1, command = self.processRadiobutton)
        rbYellow = Radiobutton(frame1, text = "Yellow", bg = "yellow", variable = self.v2, value = 2, command = self.processRadiobutton)
        rbRed.grid(row = 1, column = 2)
        rbYellow.grid(row = 1, column = 3)
        
        frame2 = Frame(window)
        frame2.pack()
        label = Label(frame2, text = "Enter your name : ")
        self.name = StringVar()
        entryName = Entry(frame2, textvariable = self.name)
        btGetName = Button(frame2, text = "get name", command = self.processButton)
        message = Message(frame2, text = "it is a widgets demo")
        label.grid(row = 1, column = 1)
        entryName.grid(row = 1, column = 2)
        btGetName.grid(row = 1, column = 3)
        message.grid(row = 1, column = 4)
        
        window.mainloop()

    def processRadiobutton(self):
        print(("Red" if self.v2.get() == 1 else "Yellow") + " is selected")
        
    def processButton(self):
        print("Your name is " + self.name.get())
        
WidgetsDemo()

上面代码中两种颜色的按键与IntVar()类型变量绑定,分别赋值1和2,然后可以用get()得到IntVar()的值,而输入文本窗口则绑定字符串变量StringVar()

Canvas: 可以用来展示一些图形

from Tkinter import *

class CanvasDemo:
    def __init__(self):
        window = Tk()
        window.title("canvas demo")
        
        self.canvas = Canvas(window, width = 200, height = 100, bg = "white")
        self.canvas.pack()
        
        frame = Frame(window)
        frame.pack()
        btRectangle = Button(frame, text = "tectangle", command = self.displayRect)
        btRectangle.grid(row = 1, column = 1)
        
        window.mainloop()
        
    def displayRect(self):
        self.canvas.create_rectangle(10, 10, 190, 90, tags = "rect")
    
CanvasDemo()

Menus

menubar = Menu(window)
window.config(menu = menubar) # Display the menu bar

operationMenu = Menu(menubar, tearoff = 0)
menubar.add_cascade(label = "Operation", menu = operationMenu) # 菜单头
operationMenu.add_command(label = "Add", command = self.add)
operationMenu.add_command(...) # 增加菜单选项

exitmenu = Menu(menubar, tearoff = 0)
menubar.add_cascade(label = "Exit", menu = exitmenu)
exitmenu.add_command(label = "Quit", command = window.quit)

Popup Menus

from Tkinter import *

class PopupMenuDemo:
    def __init__(self):
        window = Tk()
        window.title("popup menu demo")
        
        self.menu = Menu(window, tearoff = 0)
        self.menu.add_command(label = "draw a line", command = self.displayLine)
        self.menu.add_command(label = "draw an oval", command = ...)
        
    def displayLine(self):
        ...

Mouse, Key events, and Bindings

widget.bind(event, handler)
def popup(event):
    menu.post(event.x_root,event.y_root)
EventDescription
<Bi-Motion> An event occurs when a mouse button is moved while being held down on the widget.
<Button-i> Button-1, Button-2, and Button-3 identify the left, middle, and right buttons. When a mouse button is pressed over the widget, Tkinter automatically grabs the mouse pointer’s location. ButtonPressed-i is synonymous with Button-i.
<ButtonReleased-i> An event occurs when a mouse button is released.
<Double-Button-i> An event occurs when a mouse button is double-clicked.
<Enter> An event occurs when a mouse pointer enters the widget.
<Key> An event occurs when a key is pressed.
<Leave> An event occurs when a mouse pointer leaves the widget.
<Return> An event occurs when the Enter key is pressed. You can bind any key such as A, B, Up, Down, Left, Right in the keyboard with an event.
<Shift+A> An event occurs when the Shift+A keys are pressed. You can combine Alt, Shift, and Control with other keys.
<Triple-Button-i> An event occurs when a mouse button is triple-clicked.

Event Properties

Event PropertiesDescription
char The character entered from the keyboard for key events.
keycode The key code (i.e., Unicode) for the key entered from the keyboard for key events.
keysym The key symbol (i.e., character) for the key entered from the keyboard for key events.
num The button number (1, 2, 3) indicates which mouse button was clicked.
widget The widget object that fires this event.
x and y The current mouse location in the widget in pixels.
x_ root and y_root The current mouse position relative to the upper-left corner of the screen, in pixels.
from Tkinter import *

class MouseKeyEventDemo:
    def __init__(self):
        window = Tk()
        window.title("event demo")
        canvas = Canvas(window, bg = "white", width = 200, height = 100)
        canvas.pack()
        
        # Bind with <Button-1> event
        canvas.bind("<Button-1>", self.processMouseEvent)
        
        # Bind with <Key> event
        canvas.bind("<Key>", self.processKeyEvent)
        canvas.focus_set() # 对该窗口设置键盘焦点
        
        window.mainloop()
        
    def processMouseEvent(self, event):
        print("clicked at ", event.x, event.y) # 在当前窗口中的坐标
        print("position in the screen ", event.x_root, event.y_root) # 在整个屏幕中的坐标
        print("which button is clicked?", event.num)
        
    def processKeyEvent(self, event):
        print("keysym?", event.keysym)
        print("char?", event.char)
        print("keycode?", event.keycode)
        
MouseKeyEventDemo()

运行结果:

('clicked at ', 109, 53)
('position in the screen ', 908, 105)
('which button is clicked?', 1)
('keysym?', 'Shift_L')
('char?', '')
('keycode?', 50)

Animations

# coding: utf-8
from Tkinter import *

class AnimationDemo:
    def __init__(self):
        window = Tk()
        window.title("event demo")
        
        width = 250 # width
        canvas = Canvas(window, bg = "white", width = width, height = 50)
        canvas.pack()
        
        x = 0 # 初始位置
        canvas.create_text(x, 30, text = "message moving?", tags = "text")
        
        dx = 3 # 每次移动距离
        while True:
            canvas.move("text", dx, 0)
            canvas.after(100) # 停止100毫秒
            canvas.update()
            if x < width:
                x += dx
            else:
                x = 0
                canvas.delete("text")
                canvas.create_text(x, 30, text = "message moving?", tags = "text")
                
        window.mainloop()
        
AnimationDemo()

Scrollbars

scrollbar = Scrollbar(frame)
scrollbar.pack(side = RIGHT, fill = Y)
text = Text(frame, wrap = WORD, yscrollcommand = scrollbar.set)
text.pack()
scrollbar.config(command = text.yview)

Standard Dialog Boxes

#coding: utf-8

import tkColorChooser
import tkMessageBox
import tkSimpleDialog

tkMessageBox.showinfo("hello", "some info")
tkMessageBox.showwarning(title, message)
tkMessageBox.showerror(title, message)

isYes = tkMessageBox.askyesno("askyesno", "continue?")
print(isYes)

name = tkSimpleDialog.askstring("askstring", "your name?")
print(name)

height = tkSimpleDialog.askfloat("askfloat", "your height?")
print(height)
posted @ 2014-08-12 10:17  Jolin123  阅读(1241)  评论(0编辑  收藏  举报