2017-04-18 9 views
-1

Haben einen Tkinter Rahmen auf der linken Seite für Etiketten, Checkbuttons, etc. Auf der rechten Seite ist eine Leinwand mit einer Karte. Ich kann über die Karte scrollen und es gibt die Längen-/Breitengradkoordinaten an, wo sich der Mauszeiger auf der Karte zur fraglichen Zeit befindet. Ich kann auf die Karte klicken und die Karte vergrößern. Das Problem ist, wenn ich in dem Frame bin, in dem ich die zugrunde liegenden Kartendaten anzeigen möchte, während ich die Maus über den Frame scrolle, ändert sich der Längen-/Breitengrad, obwohl ich nicht auf der Leinwand bin. Wenn ich auf den Rahmen klicke, habe ich dort noch keine Checkbuttons drauf gesetzt, um es so zu testen, zoomt er genau so rein wie auf der Leinwand.Geteilte Tkinter Canvas und Rahmen auseinander

Gibt es eine Möglichkeit, die Aktion "Wahrnehmung" von Rahmen und Leinwand zu trennen, um sie getrennt zu halten.

Ich poste den Code, ein bisschen lang, aber ich bin hier raus, da ich schon spät dran bin.

Edit:

Ich bin zurück und dank Bryan Antwort ich glaube, ich verstehe, was er sagt, zu tun, nur nicht sicher, wie es zu tun. In ein paar Versuchen schien nichts zu funktionieren. Zugegeben, ich bin mir immer noch nicht ganz sicher, ob die (selbst, übergeordnete) "Adressierungs" -Methode im folgenden Code funktioniert.

Auch ich sehe hohe Wahrscheinlichkeit in der nicht zu fernen Zukunft der Notwendigkeit, in der Lage zu sein, die Maustaste auf die Leinwand und den Rahmen separat zu verweisen, oder haben Sie verschiedene Dinge je nachdem, wo ich geklickt habe . Glücklicherweise mit der Verzögerung, weil ich früher hier raus musste und mit Bryan's Antwort konnte ich den Code noch weiter verkürzen und habe nun Code, der genau das macht, wovon ich rede. Die Verspätung bei der Buchung funktionierte zu meinem Vorteil.

import tkinter as tk 
from tkinter import * 

class Example(tk.Frame): 
    def __init__(self, parent): 
     tk.Frame.__init__(self, parent) 

     self.frame = tk.Frame(self,bg='black', width=1366, height=714) 
     self.frame1 = tk.Frame(self,bg='gray', width=652, height=714) 
     self.frame.pack() 
     self.canvas = tk.Canvas(self, background="black", width=714, height=714) 
     self.canvas.pack_propagate(0) 
     self.canvas.place(x=652,y=0) 
     self.frame1.pack_propagate(0) 
     self.frame1.place(x=0,y=0) 

     self.longitudecenter = -95.9477127 
     self.latitudecenter = 36.989772 
     self.p = 57.935628 
     global v 
     s = Canvas(self, width=150, height=20) 
     s.pack_propagate(0) 
     s.place(x=0,y=695) 
     v = Label(s, bg='gray',fg='black',borderwidth=0,anchor='w') 
     v.pack() 

     parent.bind("<Motion>", self.on_motion) 
     self.canvas.focus_set() 

     self.canvas.configure(xscrollincrement=1, yscrollincrement=1) 

    def on_motion(self, event): 
     self.canvas.delete("sx") 
     self.startx, self.starty = self.canvas.canvasx(event.x),self.canvas.canvasy(event.y) 
     px = -(round((-self.longitudecenter + (self.p/2))- (self.startx * (self.p/714)),5)) 
     py = round((self.latitudecenter + (self.p/2))-(self.starty * (self.p /714)),5) 
     v.config(text = "Longitude: " + str(px)) 

if __name__ == "__main__": 
    root = tk.Tk() 
    Example(root).pack(fill="both", expand=True) 
    root.mainloop() 

Dies ist ein Teil von dem, was ich verwendet habe. Wie ändere ich es, damit ich separat an den Rahmen und an die Leinwand binden kann. Im Moment brauche ich nur mit der Mausposition, um an die Leinwand binden zu können, aber in Zukunft muss ich Mausklicks, vielleicht sogar die Mausposition separat auf der Leinwand und dem Rahmen verwenden können. Wer weiß, wie sehr sich dieses Projekt verändert/weiterentwickelt hat, seit ich es vor drei Wochen angefangen habe ... der Himmel ist das Limit).

+0

binden nur die Mausbewegung auf die Leinwand. Es klingt, als hättest du es an die gesamte App gebunden. Bitte geben Sie ein [minimales, vollständiges und verifizierbares Beispiel] (http://stackoverflow.com/help/mcve) an. Ich nehme an, dass Sie nur ein Dutzend Codezeilen benötigen, um dieses Verhalten zu reproduzieren. –

+0

Ich aktualisierte die Frage und beinhaltete das Arbeiten mit schlechtem Code, im Gegensatz zu schlechtem Code, den ich heute morgen hatte, als ich das erste Mal gepostet habe. Wie binden Sie separat sowohl an die Leinwand als auch an den Rahmen an? Ich denke, das Bedürfnis ist gleich um die Ecke, wenn ich mich an beide binden muss. – confused

Antwort

0

Wenn Sie möchten, dass eine Bindung nur für ein bestimmtes Widget ausgelöst wird, aber die Bindung für dieses Widget und nicht für ein enthaltenes Widget. diese

Wechsel:

parent.bind("<Motion>", self.on_motion) 

Um dies:

self.canvas.bind("<Motion>", self.on_motion) 
+0

Für Wissen, ich kann nicht finden, wo ich dachte, ich sah es referenziert, ist Elternteil die Bindung zu Rahmen, in dem Fall meines geposteten Code oben? Habe ich dieses Setup korrekt, so dass frame das beinhaltende Widget mit frame1 und self.canvas enthält? – confused

+0

In Ihrem Code ist "Eltern" das Hauptfenster. Innerhalb der Klasse ist "self" der Rahmen, der die Leinwand enthält. –

Verwandte Themen