Tkinter – Menu


Được đăng vào ngày 02/02/2016 | 0 bình luận
Tkinter – Menu
Đánh giá bài viết

Trong phần này chúng ta sẽ học cách tạo menu trong Tkinter.

Ví dụ

from tkinter import Frame, Tk, Menu

class Example(Frame):
  def __init__(self, parent):
    Frame.__init__(self, parent)
 
    self.parent = parent
    self.initUI()
  
  def initUI(self):
    self.parent.title("Simple Menu")
 
    menuBar = Menu(self.parent)
    self.parent.config(menu=menuBar)
 
    fileMenu = Menu(menuBar)
    fileMenu.add_command(label="Exit", command=self.onExit)
    menuBar.add_cascade(label="File", menu=fileMenu)
 
  def onExit(self):
    self.quit()
 
root = Tk()
root.geometry("250x150+300+300")
app = Example(root)
root.mainloop()

Đoạn code trên tạo một cửa sổ có một menu, trong menu này có nút Exit, bấm vào nút này thì thoát chương trình.

menubar = Menu(self.parent)
self.parent.config(menu=menubar)

Để hiển thị các menu thì đầu tiên chúng ta phải tạo một menu bar trước. Chúng ta tạo menu bar từ lớp Menu.

fileMenu = Menu(menubar)

Tiếp theo chúng ta tạo menu File cũng từ lớp Menu.

fileMenu.add_command(label="Exit", command=self.onExit)

Để thêm các item vào một menu thì chúng ta dùng phương thức add_command(), ở trên chúng ta tạo item Exit và cho item này gọi đến phương thức onExit().

menubar.add_cascade(label="File", menu=fileMenu)

Sau khi tạo xong thì chúng ta gắn menu File vào menu bar bằng phương thức add_cascade().

Untitled

Tạo menu con

Ví dụ dưới đây sẽ tạo một menu con từ một menu cha.

Chúng ta tạo menu File, trong menu này có 1 item, 1 separator (đường kẻ ngang phân cách) và 1 menu con. Trong menu con có 3 item khác.

submenu = Menu(fileMenu)
submenu.add_command(label="New feed")
submenu.add_command(label="Bookmarks")
submenu.add_command(label="Mail")

Chúng ta tạo menu con cũng giống như tạo một menu bình thường từ lớp Menu.

fileMenu.add_cascade(label='Import', menu=submenu)

Chúng ta thêm menu con bằng cách gọi phương thức add_cascade từ menu cha và truyền tham chiếu đến đối tượng menu con vào tham số menu. Như vậy các menu từ menu bar cho đến submenu đều được tạo ra từ lớp Menu. Chỉ khác là menu bar chính là menu gốc, được gắn vào cửa sổ chính.

fileMenu.add_separator()

Để hiển thị một separator (đường kẻ ngang) thì chúng ta gọi phương thức add_separator().

Untitled

Popup menu

Popup menu hay còn được gọi là menu ngữ cảnh là menu được hiện ra khi click chuột lên cửa sổ.

from Tkinter import Tk, Frame, Menu


class Example(Frame):
  
    def __init__(self, parent):
        Frame.__init__(self, parent)   
         
        self.parent = parent
        
        self.initUI()
        
        
    def initUI(self):
      
        self.parent.title("Popup menu")
        self.menu = Menu(self.parent, tearoff=0)
        self.menu.add_command(label="Beep", command=self.bell())
        self.menu.add_command(label="Exit", command=self.onExit)

        self.parent.bind("<Button-3>", self.showMenu)
        self.pack()
        
        
    def showMenu(self, e):
        self.menu.post(e.x_root, e.y_root)
       

    def onExit(self):
        self.quit()


root = Tk()
root.geometry("250x150+300+300")
app = Example(root)
root.mainloop()  

Trong ví dụ trên chúng tạo popup menu có 2 item khi click chuột phải lên cửa sổ.

self.menu = Menu(self.parent, tearoff=0)

Ban đầu chúng ta cũng tạo một đối tượng Menu như menu bình thường. Tham số tearoff=0 sẽ tắt chế độ hiển thị menu trên một cửa sổ riêng.

self.parent.bind("<Button-3>", self.showMenu)

Dòng code trên gắn sự kiện click chuột phải (<Button-3>) vào phương thức showMenu().

def showMenu(self, e):
    self.menu.post(e.x_root, e.y_root)

Trong phương thức showMenu(), chúng ta gọi phương thức self.menu.post(x, y) để hiển thị popup menu tại vị trí được chỉ định trên cửa sổ. Tham số là đối tượng của sự kiện click chuột.

Untitled






Trả lời


Lưu ý: bọc code trong cặp thẻ [code language="x"][/code] để highlight code.


Ví dụ:


[code language="cpp"]


std::cout << "Hello world";


[/code]



Các ngôn ngữ được hỗ trợ gồm: actionscript3, bash, clojure, coldfusion, cpp, csharp, css, delphi, diff, erlang, fsharp, go, groovy, html, java, javafx, javascript, latex, matlab, objc, perl, php, powershell, python, r, ruby, scala, sql, text, vb, xml.

Thư điện tử của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *