Adding or deleting tkinter widgets from within other modules

北战南征 提交于 2019-12-11 16:13:57

问题


I'd like to know how I can add or delete widgets from within an imported module. I fail to access them correctly. I know, using OOP would make it easier, but I tried to grasp OOP and while the principles are easy I can't get my head around the details, so since I lack a proper teacher, I need a procedural solution.

This is the main script:

#!/usr/bin/python

try:
   # Python2
   import Tkinter as tk
except ImportError:
   # Python3
   import tkinter as tk

 import os
 import sys

sys.path.append(os.path.dirname(os.path.realpath(__file__)))

import target

def myfunction(event):
   canvas.configure(scrollregion=canvas.bbox("all"),width=300,height=200) 

def test():
   target.secondWindow()

root = tk.Tk()
root.geometry("600x350+30+50")

myframe = tk.Frame(root,relief="groove",bd=1)
myframe.place(x=20, y=30, width=560, height=200 )

canvas = tk.Canvas(myframe)
frame = tk.Frame(canvas)
myscrollbar=tk.Scrollbar(myframe, orient="vertical", command=canvas.yview)
canvas.configure(yscrollcommand=myscrollbar.set)

myscrollbar.pack(side="right", fill="y")
canvas.pack(side="left")
canvas.create_window((0,0), window=frame, anchor='nw')

allMissions = {
    "1":{"name":"go"}, 
    "2":{"name":"see"}, 
    "3":{"name":"win"}, 
    "4":{"name":"party"}} # this would be a text file

for a in allMissions.keys():
   mn = allMissions[a]["name"]
   tk.Label(frame, text=mn, justify="left").grid(row=int(a), column=0)

# what's bind really doing?
frame.bind("<Configure>", myfunction)       

test = tk.Button(root, command=test, text="TEST")
test.place(x = 20, y = 250, width=580, height=40)

tk.mainloop()

and this is the imported module: target.py

try:
   # Python2
    import Tkinter as tk
except ImportError:
    # Python3
    import tkinter as tk  

def changeMainWindow():
   # here's where I'm stuck
   print("What do I have to do to add a new") 
   print("label in the main window from here?")
   print("Or to delete it?")  


def secondWindow():


    amWin = tk.Toplevel()

    amWin.geometry("300x200+720+50")

    button = tk.Button(amWin, text="OK", command=changeMainWindow)
    button.place(x = 20, y = 80, width=260, height=30) 

    #amWin.mainloop() comment noticed (:

回答1:


You do it by passing the memory address of whatever widget to the second program. There is no reason to import Tkinter again as you can just pass a pointer to the existing instance. If you are going to be doing anything more than simple experimenting with Tkinter, then it is well worth the time to learn classes first at one of the online sites like this one http://www.greenteapress.com/thinkpython/html/thinkpython016.html More here https://wiki.python.org/moin/BeginnersGuide/NonProgrammers
You aren't going to get many answers with the way the program is structured because most programmers use the class structure AFAIK, so do not know how to pound the code into a non-class environment, so will not have any answers. If the first program below used classes then the second program's class could be inherited, and the functions would become part of the first program's class and could be accessed in the same way as the existing classes, so no passing of pointers, or any other hack, would be necessary.

## I deleted some code for simplicity
def myfunction(event):
   canvas.configure(scrollregion=canvas.bbox("all"),width=300,height=200) 

def test():
   TG.secondWindow()

root = tk.Tk()
root.geometry("600x350+30+50")

myframe = tk.Frame(root,relief="groove",bd=1)
myframe.place(x=20, y=30, width=560, height=200 )

canvas = tk.Canvas(myframe)
frame = tk.Frame(canvas)
myscrollbar=tk.Scrollbar(myframe, orient="vertical", command=canvas.yview)
canvas.configure(yscrollcommand=myscrollbar.set)

myscrollbar.pack(side="right", fill="y")
canvas.pack(side="left")
canvas.create_window((0,0), window=frame, anchor='nw')

# what's bind really doing?
frame.bind("<Configure>", myfunction)       

test = tk.Button(root, command=test, text="TEST", bg="lightblue")
test.place(x = 20, y = 250, width=580, height=40)

tk.Button(root, text="Quit All", command=root.quit,
         bg="orange").place(x=20, y=300)

""" instance of the class in the imported program
    a pointer to the root window and the Tk instance are passed
"""
TG=target.Target(tk, root)

tk.mainloop()

And target.py. Notice there are no imports.

class Target():
    def __init__(self, tk, root):
        self.tk=tk
        self.root=root

    def changeMainWindow(self):
        # here's where I'm stuck
        self.tk.Label(self.amWin, bg="yellow", text =""""What do I have to do to add a new
label in the main window from here?
Or to delete it?""").place(x=50,y=20)

    def secondWindow(self):

        self.amWin = self.tk.Toplevel(self.root)
        self.amWin.geometry("300x200+720+50")

        button = self.tk.Button(self.amWin, text="Add Label",
                              command=self.changeMainWindow)
        button.place(x = 20, y = 90, width=260, height=30).


来源:https://stackoverflow.com/questions/27019697/adding-or-deleting-tkinter-widgets-from-within-other-modules

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!