在其他模块中添加或删除tkinter小部件

时间:2014-11-19 14:46:40

标签: python module tkinter widget

我想知道如何在导入的模块中添加或删除小部件。我无法正确访问它们。我知道,使用OOP会让事情变得更容易,但我试图掌握OOP,虽然原则很简单但我无法理解细节,所以由于缺乏合适的老师,我需要一个程序解决方案。 / p>

这是主要的脚本:

#!/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()

,这是导入的模块: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 个答案:

答案 0 :(得分:0)

您可以通过将任何小部件的内存地址传递给第二个程序来实现。没有理由再次导入Tkinter,因为您只需将指针传递给现有实例即可。如果您要做的不仅仅是简单地尝试使用Tkinter,那么最好先在其中一个在线网站上学习课程http://www.greenteapress.com/thinkpython/html/thinkpython016.html更多https://wiki.python.org/moin/BeginnersGuide/NonProgrammers 由于大多数程序员使用类结构AFAIK,因此不会知道如何将代码写入非类环境中,因此不会有任何答案,因此您无法通过程序结构的方式获得许多答案。如果下面的第一个程序使用了类,那么第二个程序的类可以继承,并且这些函数将成为第一个程序类的一部分,并且可以以与现有类相同的方式访问,所以没有传递指针或其他任何黑客都是必要的。

## 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()

和target.py。请注意,没有导入。

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).