用python製作一個微型文字編輯器
阿新 • • 發佈:2020-11-24
Tkinter是一個Python標準GUI(圖形使用者介面)工具包,本篇我們就用Tkinter來製作一個微型文字編輯器。
這個文字編輯器要有四個基本功能:
- 讓使用者能夠開啟指定的文字檔案
- 讓使用者能夠編輯文字檔案
- 讓使用者能夠儲存文字檔案
- 讓使用者能夠退出
首先我們先繪製一個使用者介面草圖:
它的使用方法是:
- 在按鈕左邊的文字框中輸入檔名,再單擊Open按鈕開啟這個檔案,它包含的文字將出現在底部的文字框中
- 在底部的大型文字框中,你可隨心所欲地編輯文字
- 要儲存所做的修改,可單擊Save按鈕,這將把大型文字框的內容寫入到頂部文字框指定的檔案中
- 沒有Quit(退出)按鈕,使用者只能使用預設Tkinter選單中的Quit命令來退出程式
首先來看製作這個編輯器需要的基礎知識:
一、基本構建
首先,匯入tkinter:
from tkinter import *
建立一個將充當主視窗的頂級元件:
top = Tk()
建立按鈕,例項化Button類:
btn = Button()
呼叫佈局管理器pack:
btn.pack()
給按鈕指定文字:
btn['text'] = 'Click me!'
就這樣:
出來效果長這樣:
接著給按鈕新增行為:
def clicked(): ... print('I was clicked!') ...
btn['command'] = clicked
這時點選click me的按鈕,互動器裡就會彈出:
二、佈局
對控制元件呼叫方法pack時,將把控制元件放在其父控制元件(主控制元件)中。要指定主控制元件,可使用建構函式的第一個可選引數;如果沒有指定,將把頂級主視窗用作主控制元件:
1 Label(text="I'm in the first window!").pack() 2 second = Toplevel() 3 Label(second, text="I'm in the second window!").pack()
其中Toplevel類表示除主視窗外的另一個頂級視窗,而Label就是文字標籤。
出來效果就是這樣:
沒有提供任何引數時,pack從視窗頂部開始將控制元件堆疊成一列,並讓它們在視窗中水平居中。比如如果你用一個迴圈:
for i in range(10): Button(text=i).pack()
就會變成這樣:
不過我們可以調整控制元件的位置和拉伸方式,具體使用的方法用help指令來看:
>>> help(Pack.config) >>> help(Grid.configure) >>> help(Place.config)
三、事件處理
可通過設定屬性command給按鈕指定動作(action)。這是一種特殊的事件處理,但Tkinter還提供了更通用的事件處理機制:方法bind。要讓控制元件對特定的事件進行處理,可對其呼叫方法bind,並指定事件的名稱和要使用的函式:
1 from tkinter import * 2 top = Tk() 3 def callback(event): 4 print(event.x, event.y) 5 top.bind('<Button-1>', callback) 6 '4322424456callback'
其中<Button-1>是使用滑鼠左按鈕(按鈕1)單擊的事件名稱。我們將這種事件關聯到函式callback。這樣,每當使用者在視窗top中單擊時,都將呼叫這個函式。
具體的使用和調整可以參考:
>>> help(Tk.bind)
至此,相關的基礎知識就介紹完畢了,最後回到開頭那個微型文字編輯器,它的完整程式碼如下:
1 from tkinter import * 2 from tkinter.scrolledtext import ScrolledText 3 def load(): 4 with open(filename.get()) as file: 5 contents.delete('1.0', END) 6 contents.insert(INSERT, file.read()) 7 def save(): 8 with open(filename.get(), 'w') as file: 9 file.write(contents.get('1.0', END)) 10 top = Tk() 11 top.title("Simple Editor") 12 contents = ScrolledText() 13 contents.pack(side=BOTTOM, expand=True, fill=BOTH) 14 filename = Entry() 15 filename.pack(side=LEFT, expand=True, fill=X) 16 Button(text='Open', command=load).pack(side=LEFT) 17 Button(text='Save', command=save).pack(side=LEFT) 18 mainloop()
執行效果如下:
這樣,一個微型文字編輯器就完成了。