KOntext-Menü

Fragen zu Tkinter.
Antworten
stefanxfg
User
Beiträge: 85
Registriert: Sonntag 2. April 2017, 14:11

Hallo an Alle!

Ich bin an der Programmierung einer GUI. Ich habe sie anfänglich mit dem Programm Page erstellt in der Umgebung Python 2.7.8. Ich möchte nun ein Context Menu einfügen. Ich habe einen COde dafür im Netz gefunden, der unabhängig von meiner GUI auch funktioniert. Mein Code geht ungefär so:

Code: Alles auswählen

class App:
	def __init__(self, top=None):
		#Deklaration Menübar (nicht Context-Menü)
		
		#Deklaration Inhalt z.B TNotebook mit Unterframes
		
		#Einbinden Context-Menü
       		# create a popup menu
		self.aMenu = Menu(self.Frame2, font="TkMenuFont",bg=_bgcolor,fg=_fgcolor, tearoff=1)
		self.aMenu.add_command(label="Undo", command=self.hello)
		self.aMenu.add_command(label="Redo", command=self.hello)
      		# create a frame
		self.aFrame = Frame(self.Frame2)
		self.aFrame.place(relx=0.0, rely=0.0, relwidth=1.0, relheight=1.0)	
		#attach popup to frame		
		self.aFrame.bind("<Button-3>", self.popup)
	
	def hello(self):
		print"hello"
		
	def popup(self, event):
		self.aMenu.post(event.x_root, event.y_root)	

Das Problem ist, dass das Context-Menü in einem erzeugten Frame erscheint. Dieses Frame wird jedoch von anderen Frames überlagert. Ich wollte eigentlich ein übergordnetes Bedarfs-Frame bei Click-Event erzeugen, dass überall erscheinen kann.

Könnt ihr mir helfen?

Grüße von Stefan
Zuletzt geändert von Anonymous am Mittwoch 5. April 2017, 09:13, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@stefanxfg: Ich habe die Problembeschreibung ehrlich gesagt nicht verstanden. Kannst Du ein minimales, aber lauffähiges Beispiel zeigen wo man das Problem nachvollziehen kann?
stefanxfg
User
Beiträge: 85
Registriert: Sonntag 2. April 2017, 14:11

Hallo. Ja das stimmt. Optisch sehen, was das Problem ist, ist halt immer besser. Hier der Code, wo das Kontextmenü ausgeblendet ist. Bei Einblendung, sitzt das Frame über alle Instanzen und überdeckt damit alle Bereiche. Ich möchte aber unabhängig davon bei einem Klick das Kontextmenü, genauso wie jetzt aber ich sehe das Menü nicht mehr.

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: iso-8859-15 -*-
import sys

try:
    from Tkinter import *
except ImportError:
    from tkinter import *

try:
    import ttk
    py3 = 0
except ImportError:
    import tkinter.ttk as ttk
    py3 = 1

import xyz_support

from Tkinter import Tk, Frame, Menu
from Tkinter import Button, LEFT, TOP, X, FLAT, RAISED

import Tkinter


def vp_start_gui():
	'''Starting point when module is the main routine.'''
	global val, w, root
	root = Tk()
	top = App (root)
	root.mainloop() 	
	

	
w = None
def create_App(root, *args, **kwargs):
	'''Starting point when module is imported by another program.'''
	global w, w_win, rt, rm
	rt = root
	w = Toplevel (root)
	top = App (w)
	rm = self.TNotebook1
	xyz_support.init(w, top, *args, **kwargs)
	return (w, top)

def destroy_App():
	global w
	w.destroy()
	w = None



	
class App:
	def __init__(self, top=None):
		_bgcolor = '#d9d9d9'  # X11 color: 'gray85'
		_fgcolor = '#000000'  # X11 color: 'black'
		_compcolor = '#d9d9d9' # X11 color: 'gray85'
		_ana1color = '#d9d9d9' # X11 color: 'gray85' 
		_ana2color = '#d9d9d9' # X11 color: 'gray85' 
		font9 = "-family Arial -size 9 -weight normal -slant roman "  \
			"-underline 0 -overstrike 0"
		self.style = ttk.Style()
		if sys.platform == "win32":
			self.style.theme_use('winnative')
		self.style.configure('.',background=_bgcolor)
		self.style.configure('.',foreground=_fgcolor)
		self.style.configure('.',font="TkDefaultFont")
		self.style.map('.',background=
			[('selected', _compcolor), ('active',_ana2color)])

		top.geometry("1024x618+363+230")
		top.title("MainPage")
		top.configure(background="#d9d9d9")
		top.configure(highlightbackground="#d9d9d9")
		top.configure(highlightcolor="black")
		
		
		contentframeheigth = 33 #icons 16 bit = 33; icons 24 bit = 41; icons 32 bit = 49
		contentframewidth = 150 #icons 16 bit = 150; icons 24 bit = 190; icons 32 bit = 230
		
		#Toolbar-Menü
		self.Frame1 = Frame(top)
		self.Frame1.place(relx=0.0, y=0.0, height=contentframeheigth, relwidth=1.0)
		self.Frame1.configure(relief=GROOVE)
		self.Frame1.configure(borderwidth="2")
		self.Frame1.configure(relief=GROOVE)
		self.Frame1.configure(background="#d9d9d9")
	
		#Content Eingabe
		self.Frame2 = Frame(top)
		self.Frame2.place(relx=0.0, y=contentframeheigth, relheight=1.0, relwidth=1.0)
		self.Frame2.configure(relief=GROOVE)
		self.Frame2.configure(borderwidth="2")
		self.Frame2.configure(relief=GROOVE)
		self.Frame2.configure(background="#d9d9d9")				
		


		
	
		self.style.configure('TNotebook.Tab', background=_bgcolor)
		self.style.configure('TNotebook.Tab', foreground=_fgcolor)
		self.style.map('TNotebook.Tab', background=[('selected', _compcolor), ('active',_ana2color)])
		self.TNotebook1 = ttk.Notebook(self.Frame2)
		self.TNotebook1.place(relx=0.0, rely=0.0, relheight=0.93, relwidth=1.0) #klein rely=0.07; groß=0.05
		self.TNotebook1.configure(width=1024)
		self.TNotebook1.configure(takefocus="")
		self.TNotebook1_pg0 = ttk.Frame(self.TNotebook1)
		self.TNotebook1.add(self.TNotebook1_pg0, padding=3)
		self.TNotebook1.tab(0, text="xxx",underline="-1",)
		self.TNotebook1_pg1 = ttk.Frame(self.TNotebook1)
		self.TNotebook1.add(self.TNotebook1_pg1, padding=3)
		self.TNotebook1.tab(1, text="yyy",underline="-1",)
		self.TNotebook1_pg2 = ttk.Frame(self.TNotebook1)
		self.TNotebook1.add(self.TNotebook1_pg2, padding=3)
		self.TNotebook1.tab(2, text="zzz",underline="-1",)
		self.TNotebook1_pg3 = ttk.Frame(self.TNotebook1)
		self.TNotebook1.add(self.TNotebook1_pg3, padding=3)
		self.TNotebook1.tab(3, text="aaa",underline="-1",)
		self.TNotebook1_pg4 = ttk.Frame(self.TNotebook1)
		self.TNotebook1.add(self.TNotebook1_pg4, padding=3)
		self.TNotebook1.tab(4, text="bbb",underline="-1",)

	
	
		"""
        # create a popup menu
		self.aMenu = Menu(self.Frame2, font="TkMenuFont",bg=_bgcolor,fg=_fgcolor, tearoff=1)
		self.aMenu.add_command(label="Undo", command=self.hello)
		self.aMenu.add_command(label="Redo", command=self.hello)
        # create a frame
		self.aFrame = Frame(self.Frame2)
		self.aFrame.place(relx=0.0, rely=0.0, relwidth=1.0, relheight=1.0)
        
		## attach popup to frame
		
		self.aFrame.bind("<Button-3>", self.popup)
		"""
	def hello(self):
		print"hello"
		
	def popup(self, event):
		self.aMenu.post(event.x_root, event.y_root)

			

if __name__ == '__main__':
    vp_start_gui()
Zuletzt geändert von Anonymous am Mittwoch 5. April 2017, 09:54, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@stefanxfg: Hm, die Antwort ist eigentlich einfach und offensichtlich. Du möchtest nicht das ein Frame den gesamten Inhalt von `Frame2` verdeckt, aber Du erstellst einen Frame der den gesamten Inhalt von `Frame2` verdeckt. Lass das einfach sein. :-)

Du musst das Kontextmenü an alles bereits vorhandene binden wo es auftauchen soll. Also einzeln an jedes Widget. Alternativ kannst Du es auch an die gesamte Anwendung mit `bind_all()` binden, dann taucht es aber auch in der Toolbar und überall anders auf.

Statt `post()` würde ich für ein Popup-Menü übrigens eher `tk_popup()` verwenden.
stefanxfg
User
Beiträge: 85
Registriert: Sonntag 2. April 2017, 14:11

Danke für die schnelle Antwort. Ich hatte das schon mit dem überdecken gesehen. Ich wusste aber nicht , wie ich es anders binden konnte.
stefanxfg
User
Beiträge: 85
Registriert: Sonntag 2. April 2017, 14:11

Hallo nocheinmal.

Mit den tk_popup tue ich mich noch schwer, da es erweiterte Deklarationen erfordert. Und ich habe diese Form erst einmal so vorgegeben bekommen. Könntest du mir dabei behilflich sein, damit ich das tk_modul verwenden kann?

Grüße von Stefan
BlackJack

@stefanxfg: „Erweiterte Deklarationen“? Das erwartet die gleichen ersten beiden Argumente wie `post()`, da muss man also sonst gar nichts ändern.
Antworten