2017-12-19 66 views
-1

メニューバーのメニューのいずれかでtkinterにメニューバーを作成していますが、check_buttonがあり、そのうちの1つがクリックされるとメニューが閉じますが、このメニューを保存します。開いた。私はそれを行う簡単な方法があるかどうかを知りたい。私は地図エディタを作っています。私のメニューでは、地図の要素を表示するかどうかを選択します。例以下はtkinterメニューバーとチェックボックスを開いたままにする

menubar = tk.Menu() 
viewMenu = tk.Menu(menubar, tearoff = 0) 
viewMenu.add_check_button(label = "Obstacles", varibale = test1) 
viewMenu.add_check_button(label = "Ground", varibale = test2) 
menubar.add_cascade(menu = viewMenu, label = "View") 
win.config(menu = menubar) # win = tk.Tk() 
+1

メニューを作成してこれまでの内容を確認できるコードスニペットを含めることができますか?このようにして、あなたを手伝ってくれる人は最初から始めなくてもいいです。 –

+2

質問に[mcve]を含めてください。 – Novel

+0

btw:メニューには 'tearoff'というオプションがありますので、メニューを切り取ることができます(メニューバーから切り取ることができます)。ポップアップメニューとして表示されます。少なくともそれはLinux上で動作します。 – furas

答えて

0

バックチェックボタンが選択されるたびビューを開きます。

import tkinter as tk 

root = tk.Tk() 

test1, test2 = tk.BooleanVar(), tk.BooleanVar() 

def cb(): 
    print(test1.get(), test2.get()) 
    root.tk.call('::tk::TraverseToMenu', root, 'v') 

menubar = tk.Menu(root) 
viewMenu = tk.Menu(menubar, tearoff = 0) 
viewMenu.add_checkbutton(label = "Obstacles", variable = test1, command=cb) 
viewMenu.add_checkbutton(label = "Ground", variable = test2, command=cb) 
menubar.add_cascade(menu = viewMenu, label = "View") 
root.config(menu = menubar) # win = tk.Tk() 

root.mainloop() 

を詳細herehereを参照してください。 - Vが開きますtraverse_to_menu

import tkinter as tk 

root = tk.Tk() 

if root._windowingsystem == 'win32': 
    import ctypes 

    keybd_event = ctypes.windll.user32.keybd_event 
    alt_key = 0x12 
    key_up = 0x0002 

    def traverse_to_menu(key=''): 
     if key: 
      ansi_key = ord(key.upper()) 
      # press alt + key 
      keybd_event(alt_key, 0, 0, 0) 
      keybd_event(ansi_key, 0, 0, 0) 

      # release alt + key 
      keybd_event(ansi_key, 0, key_up, 0) 
      keybd_event(alt_key, 0, key_up, 0) 

else: 
    # root._windowingsystem == 'x11' 
    def traverse_to_menu(key=''): 
     root.tk.call('tk::TraverseToMenu', root, key) 

test1, test2 = tk.BooleanVar(), tk.BooleanVar() 
menubar = tk.Menu(root) 
viewMenu = tk.Menu(menubar, tearoff = 0) 
viewMenu.add_checkbutton(label = "Obstacles", variable = test1, 
          command=lambda : traverse_to_menu('v')) 
viewMenu.add_checkbutton(label = "Ground", variable = test2, 
          command=lambda : traverse_to_menu('v')) 
menubar.add_cascade(menu = viewMenu, label = "View") 
root.config(menu = menubar) # win = tk.Tk() 

root.mainloop() 

key変数は'v'としてAltキーで次のように非常に類似したコードを書くことができ、Windowsの特殊なケースhereを占め回答に基づいて


キーボードからのメニュー。 keyのように、デフォルトでキーボードを使用してメニューを開く非変更キーである必要があります。

+1

私はPy3の下でこれを実行しましたが、チェックボタンの1つがクリックされた後にviewMenuが再び表示されることはありません...何か不足していますか?私もWindows上にいます(10)。あなたが参照している2つのリンクで見たことから、Linuxを走らせている人はこれでもっとうまくいくように思えます。私はtearoff = 1に設定しようとしましたが、それは効果がありませんでした。 – Gary02127

+0

@ Gary02127 [CommonSense](https://stackoverflow.com/users/6634373/commonsense)の[回答](https://stackoverflow.com/a/47927605/7032856)に感謝します。ここで答えを提供するコード。 – Nae

関連する問題