PyGTK - MenuBar, Menu và MenuItem

Một thanh ngang ngay bên dưới thanh tiêu đề của gtk cấp cao nhất .Window được dành riêng để hiển thị một loạt menu. Nó là một đối tượng của lớp gtk.MenuBar trong API PyGTK.

Một đối tượng của lớp gtk.Menu được thêm vào thanh menu. Nó cũng được sử dụng để tạo menu ngữ cảnh và menu bật lên. Mỗi menu có thể chứa một hoặc nhiều tiện ích gtk.MenuItem. Một số trong số chúng có thể là một menu con. Và có các nút MenuItem xếp tầng.

Gtk.MenuBar được phân lớp từ lớp gtk.MenuShell. Nó có một hàm tạo mặc định đơn giản -

gtk.MenuBar()

Để thêm một menu vào MenuBar, phương thức append () của lớp MenuBar được sử dụng.

Để tạo menu, hãy tạo tiện ích MenuItem với nhãn muốn xuất hiện trên thanh menu và đặt nó làm menu con.

Ví dụ: mã sau được sử dụng để thiết lập menu Tệp -

menu1 = gtk.Menu()
file = gtk.MenuItem("_File")
file.set_submenu(menu1)

Bây giờ, một hoặc nhiều widget của lớp MenuItem có thể được thêm vào menu.

item1 = gtk.MenuItem("New")
item2 = gtk.MenuItem("Open")

Các MenuItems này được thêm vào tiện ích Menu và đối tượng menu lần lượt được thêm vào thanh menu.

menu1.append(item1)
menu1.append(item2)
mb.append(menu1)

Bộ công cụ PyGTK cung cấp nhiều loại tiện ích MenuItem. ImageMenuItem là một mục menu có hình ảnh được liên kết với nó. Bạn có thể sử dụng bất kỳ hình ảnh có sẵn nào bằng cách sử dụng tham số Stock ID hoặc gán bất kỳ hình ảnh nào khác bằng phương thức set_image ().

Ví dụ: mục menu 'Mới' có hình ảnh được tạo theo cách sau:

new = gtk.ImageMenuItem(gtk.STOCK_NEW)
menu1.append(new)

Tương tự, cũng có thể thêm CheckMenuItem bằng đoạn mã sau:

chk = gtk.CheckMenuItem("Checkable")
menu1.append(chk)

Một nhóm các mục radio cũng có thể được thêm vào bằng cách sử dụng mã này -

radio1 = gtk.RadioMenuItem(None,"Radio1")
radio2 = gtk.RadioMenuItem(radio1, "Radio2")
menu1.append(radio1)
menu1.append(radio2)

Đôi khi, bạn có thể muốn thêm một dòng tách biệt giữa các mục menu. Với mục đích đó,SeparatorMenuItem cũng có sẵn.

sep = gtk.SeparatorMenuItem()
menu1.append(sep)

Bạn cũng có thể gán phím tắt cho các mục menu. PyGTK có máy gia tốc. Bắt đầu bằng cách tạo một nhóm tăng tốc và gắn nó vào cửa sổ cấp trên.

acgroup = gtk.AccelGroup()
self.add_accel_group(acgroup)

Để gán phím tắt, hãy sử dụng add_accelerator() chức năng với nguyên mẫu sau:

Item1.add_accelerator(signal, group, key, modifier, flags)

Sau đây là một số công cụ sửa đổi được xác định trước:

  • SHIFT_MASK
  • LOCK_MASK
  • CONTROL_MASK
  • BUTTON1_MASK
  • BUTTON1_MASK

Để gán phím tắt Ctrl + N cho mục Menu mới, hãy sử dụng cú pháp sau:

new = gtk.ImageMenuItem(gtk.STOCK_NEW,acgroup)
new.add_accelerator("activate", acgroup, ord('N'), 
   gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)

Thí dụ

Ví dụ sau minh họa các tính năng được thảo luận ở trên -

import gtk

class PyApp(gtk.Window):
   def __init__(self):
      
      super(PyApp, self).__init__()
      self.set_title("Menu Demo")
      self.set_default_size(250, 200)
      self.set_position(gtk.WIN_POS_CENTER)
      
      mb = gtk.MenuBar()
      
	  menu1 = gtk.Menu()
      file = gtk.MenuItem("_File")
      file.set_submenu(menu1)
      acgroup = gtk.AccelGroup()
      self.add_accel_group(acgroup)
      new = gtk.ImageMenuItem(gtk.STOCK_NEW,acgroup)
      new.add_accelerator("activate", acgroup, ord('N'), 
         gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
      
      menu1.append(new)
      open = gtk.ImageMenuItem(gtk.STOCK_OPEN)
      
      menu1.append(open)
      chk = gtk.CheckMenuItem("Checkable")
      
      menu1.append(chk)
      radio1 = gtk.RadioMenuItem(None,"Radio1")
      radio2 = gtk.RadioMenuItem(radio1, "Radio2")
      
      menu1.append(radio1)
      menu1.append(radio2)
      sep = gtk.SeparatorMenuItem()
      
      menu1.append(sep)
      exit = gtk.ImageMenuItem(gtk.STOCK_QUIT)
      
      menu1.append(exit)
      menu2 = gtk.Menu()
      edit = gtk.MenuItem("_Edit")
      edit.set_submenu(menu2)
      copy = gtk.ImageMenuItem(gtk.STOCK_COPY)
      
      menu2.append(copy)
      cut = gtk.ImageMenuItem(gtk.STOCK_CUT)
      
      menu2.append(cut)
      paste = gtk.ImageMenuItem(gtk.STOCK_PASTE)
      
      menu2.append(paste)
      mb.append(file)
      mb.append(edit)
      vbox = gtk.VBox(False, 2)
      vbox.pack_start(mb, False, False, 0)
      
      self.add(vbox)
      self.connect("destroy", gtk.main_quit)
      self.show_all()
if __name__ == '__main__':
   PyApp()
   gtk.main()

Đoạn mã trên sẽ tạo ra kết quả sau: