當前位置:首頁 ? tkinter ? 正文

tkinter的Text組件的虛擬事件

虛擬事件:復制,剪切,粘貼

對于文本操作,復制,剪切,粘貼是最常用的操作了,如果是自己來寫代碼操作復制,粘貼功能,就要操作剪貼板,要寫不少代碼,但利用tkinter為Text組件提供了虛擬事件,讓我們很容易就可以做到復制,剪切,粘貼3項功能。

這3項虛擬事件是:

event_generate("<<Copy>>"))   # 虛擬復制事件

event_generate("<<Cut>>"))    # 虛擬剪切事件

event_generate("<<Paste>>"))  #虛擬粘貼事件

 

下面代碼,我在Text組件,我通過創建右鍵菜單,來調用虛擬事件。

from tkinter import *
 
def popup_menu(event):
    popup.post(event.x_root,event.y_root) # 彈出右鍵菜單
 
root=Tk()
 
scr1=Scrollbar(root)  # 垂直滾動條
scr1.pack(side='right',fill=Y)
 
te1=Text(root)
te1.pack(side='left',fill=BOTH,expand=True)
te1.insert(END,'點擊鼠標右鍵,測試一下復制,剪貼,粘貼功能。')
 
te1.config(yscrollcommand = scr1.set) # 滾動條的綁定
scr1.config(command = te1.yview)   # 滾動條的綁定
 
popup=Menu(root,tearoff=0)
popup.add_command(label='復制',command=lambda:te1.event_generate("<<Copy>>"))
popup.add_command(label='剪切',command=lambda:te1.event_generate("<<Cut>>"))
popup.add_command(label='粘貼',command=lambda:te1.event_generate("<<Paste>>"))
 
root.bind("<Button-3>",popup_menu) # 鼠標右鍵菜單綁定函數
 
root.mainloop()

 運行結果

18.PNG

 

有了虛擬事件,復制,剪切,粘貼功能真的很容易實現。

 

關鍵詞查找 search()方法

在Text組件里,可以通過search()方法查找關鍵詞文本,返回的是找到的第1個關鍵詞字符的位置,如果現在創建了一個Text對象tel,那么語法是:

weizi=te1.search(關鍵詞字符,開始位置,查找位置)

注:查找到關鍵字,就返回找到的關鍵字的起始位置,如果沒有找到,就返回空字符。

 

下面我就用代碼來演示如何在Text組件里查找字符,我來模擬一下記事本的查找,用另外一個窗口來顯示查詢界面,也算是溫習一下以前學習的Toplevel組件的相關知識。

    我在上面的代碼里,在彈出菜單項再增加一個分割線,一個‘查找’菜單項。 

from tkinter import *
 
def popup_menu(event):
    popup.post(event.x_root,event.y_root) # 彈出右鍵菜單
def findfrm(): # 顯示查找窗口
    top1=Toplevel(root,width=230,height=50) # 查找窗口
    
    a,b=230,50 # 查找窗口的寬和高
    c=root.winfo_x()+((root.winfo_width()-a)/2)
    d=root.winfo_y()+((root.winfo_height()-b)/2)
    top1.geometry('%dx%d+%d+%d' % (a,b,c,d)) # 查找窗口居中
    
    top1.attributes("-toolwindow", 1) # 無最大化,最小化
    top1.transient(root) # 窗口只置頂root之上
    top1.resizable(False,False) # 不可調節窗體大小
    top1.focus_force()  # 得到焦點
    
    en1=Entry(top1)  # 輸入查找關鍵字的單行文本框
    en1.pack(side=LEFT,padx=10)    
    but1=Button(top1,text="  確 定  ",command=lambda:findok(en1.get()))
    but1.pack(side=LEFT,padx=(0,10))
    en1.focus_force() # 單行文本框得到焦點
def findok(key): # 查找關鍵詞函數
    start='1.0' # 初始化,查找起始位置
    te1.tag_remove('tag1','1.0',END) # 初始化,移除標簽,但不刪除標簽的設置定義
    if key=='': # 關鍵詞為空,退出
        return
    while True: # 循環查找
        weizi=te1.search(key,start,END)
        print(weizi) # 輸出查找返回的結果
        if weizi=='' : # 返回值為空,就是找不到
            break # 跳出循環
        te1.tag_add('tag1',weizi, weizi+'+' + str(len(key))+'chars') # 找到了就新建一個標簽
        start=weizi+'+' + str(len(key))+'chars' # 找到了,就把起始位置定義為:找到位置+關鍵字的長度
    
root=Tk() # 源碼來自wb98.com
 
scr1=Scrollbar(root)  # 垂直滾動條
scr1.pack(side='right',fill=Y)
 
te1=Text(root)
te1.pack(side='left',fill=BOTH,expand=True)
 
te1.config(yscrollcommand = scr1.set) # 滾動條的綁定
scr1.config(command = te1.yview)   # 滾動條的綁定
 
popup=Menu(root,tearoff=0)
popup.add_command(label='復制',command=lambda:te1.event_generate("<<Copy>>"))
popup.add_command(label='剪切',command=lambda:te1.event_generate("<<Cut>>"))
popup.add_command(label='粘貼',command=lambda:te1.event_generate("<<Paste>>"))
popup.add_separator() # 增加分割線
popup.add_command(label='查找',command=findfrm) # 增加一個查找菜單項
 
root.bind("<Button-3>",popup_menu) # 鼠標右鍵菜單綁定函數
 
te1.tag_config('tag1',background='red',foreground='white') # 查找標簽的設置定義:紅底白字
 
root.mainloop()

 運行結果:

19.PNG

運行后,點鼠標右鍵,再點‘查找’菜單項,出現搜索框。搜索窗口是由Toplevel組件,它會在它的父組件居中顯示,相關代碼,在我前面的文章里都講解過,下面我重點講解代碼里的 search()方法使用。

    while True: # 循環查找
        weizi=te1.search(key,start,END)
        print(weizi) # 輸出查找返回的結果
        if weizi=='' : # 返回值為空,就是找不到
            break # 跳出循環
        te1.tag_add('tag1',weizi, weizi+'+' + str(len(key))+'chars') # 找到了就新建一個標簽
        start=weizi+'+' + str(len(key))+'chars' # 找到了,就把起始位置定義為:找到位置+關鍵字的長度


 

查找關鍵字的相關代碼就是上面幾行,查找模塊是無限循環查找,直到找不到才退出循環。

當查找返回的weizi =''時,就說明沒有查找到,要退出循環,不跳出循環就會死循環了。

無論查找的結果如何,我都用print(weizi)來輸出,讓大家了解返回的位置信息。

一旦查找到關鍵字時,要做2件事:

1 是為這個查找的關鍵字新建一個標簽,這個標簽的范圍就是查找到的位置為起始位置,結束位置就是起始位置 + 關鍵字的長度。

2是把下一次查找的起始位置改成:查找到的位置+ 關鍵字的長度。

 

在循環查找關鍵字之前,不要忘記初始化,即:

    start='1.0' # 初始化,查找起始位置
    te1.tag_remove('tag1','1.0',END) # 初始化,移除標簽,但不刪除標簽的設置定義


Text組件插入圖片,按鈕組件

Text組件不但可以插入文本,也可以插入圖片。

插入的圖片也要先用 PhotoImage()方法創建圖片對象。

插入圖片的方法是: image_create(插入位置,image=圖片對象)

 

下面是插入圖片的代碼

from tkinter import *
 
root=Tk()
 
scr1=Scrollbar(root)  # 垂直滾動條
scr1.pack(side='right',fill=Y)
 
te1=Text(root,width=36,height=18)
te1.pack(side='left',fill=BOTH,expand=True)
 
img1=PhotoImage(file='wz.png')
te1.image_create(END,image=img1)
 
te1.insert(END,'\n\n以上是我的網站:何老師的濟亨網')
 
te1.config(yscrollcommand = scr1.set) # 滾動條的綁定
scr1.config(command = te1.yview)   # 滾動條的綁定
 
root.mainloop()

運行結果 

20.PNG

Text組件還可以插入組件,這一點,是不是感覺Text組件有點框架組件的意思?

Text組件插入組件的方法是:先創建要插入的組件,然后用:

 window_create(插入位置,window=組件)  插入組件。

 

Text組件插入的組件還可以觸發相關事件,下面代碼在上面的代碼基礎上再插入一個按鈕。 

from tkinter import *
 
def okimg1():
    te1.image_create(END,image=img1)
 
root=Tk()
 
scr1=Scrollbar(root)  # 垂直滾動條
scr1.pack(side='right',fill=Y)
 
te1=Text(root,width=36,height=18)
te1.pack(side='left',fill=BOTH,expand=True)
 
img1=PhotoImage(file='wz.png')
te1.image_create(END,image=img1)
 
te1.insert(END,'\n\n以上是我的網站:何老師的濟亨網\n')
 
but1=Button(root,text="創建一個圖片",command=okimg1) # 創建按鈕
te1.window_create(END,window=but1) # 插入按鈕
 
te1.config(yscrollcommand = scr1.set) # 滾動條的綁定
scr1.config(command = te1.yview)   # 滾動條的綁定
 
root.mainloop()

運行后,點擊按鈕,結果是再在Text組件里插入一個圖片。

21.PNG

 

能插入按鈕,當然也可以插入別的組件,下面代碼,我們再增加一個多選按鈕,勾選這個多選按鈕,就會在插入圖片后,再提示一下。

from tkinter import *
from tkinter import messagebox
 
def okimg1():
    te1.image_create(END,image=img1)
    if var.get()==1:
        messagebox.showinfo("提示:","剛才插入了一個圖片") # 勾選就提示
        
root=Tk()
 
scr1=Scrollbar(root)  # 垂直滾動條
scr1.pack(side='right',fill=Y)
 
te1=Text(root,width=36,height=18)
te1.pack(side='left',fill=BOTH,expand=True)
 
img1=PhotoImage(file='wz.png')
te1.image_create(END,image=img1)
 
te1.insert(END,'\n\n以上是我的網站:何老師的濟亨網\n')
 
but1=Button(root,text="創建一個圖片",command=okimg1) # 創建按鈕
te1.window_create(END,window=but1) # 插入按鈕
 
var=IntVar()
ch1=Checkbutton(root,text="插入圖片后再提示一下",variable=var)
te1.window_create(END,window=ch1) # 插入多選按鈕
 
te1.config(yscrollcommand = scr1.set) # 滾動條的綁定
scr1.config(command = te1.yview)   # 滾動條的綁定
 
root.mainloop()

 

以上代碼不用多解釋了吧,舉一反三的你應該還可以插入別的組件……

 

Text組件要講解的知識太多了,但基礎的知識我都講解了,對于新手來說,已經夠了,以后就慢慢積累,大家互相交流,共同進步。

 

下一篇文章講解Canvas畫布組件

此文章來自:wb98.com  網站還有相關的系列課程文章,感興趣的可以前往。


來源:濟亨網

本文鏈接:http://www.chinaengraver.com/post/331.html

    << 上一篇 下一篇 >>

    湘公網安備 43011102000514號 - 湘ICP備08100508號

    2019年秋霞鲁丝片瓜皮_导航亚洲AV日韩AV永久无码_有没有哪些可以看片的免费的_国产色妞妞在线视频免费播放