【问题标题】:Python tkinter accessing object propertiesPython tkinter 访问对象属性
【发布时间】:2013-06-11 10:45:32
【问题描述】:

我是 python 和编程的初学者。我正在尝试为我的 tkinter 程序创建一个看起来像(有点!)的模板空窗口。

我有 2 个脚本。一个用于主程序,另一个用于所有功能。我的想法是将带有函数的脚本导入到主脚本中并使用模板。

我的主脚本在这里(main.py):

import module1 as md1
import Tkinter as tk

main_sizex=1280
main_sizey=750
main_posx=1
main_posy=1
main_title="Hello! This is a test"
main_titlesize=22
root=tk.Tk()
md1.Drag_Window(root, main_sizex, main_sizey, main_posx, main_posy, main_title, main_titlesize)
root.mainloop()

我的其他功能脚本(module1.py):

import Tkinter as tk
def Drag_Window(name,sizex,sizey,posx,posy,title,titlesize):
    def StartMove(event):
        global x,y
        x = event.x
        y = event.y
    def StopMove(event):
        x = None
        y = None
    def OnMotion(event):
        x1 = x
        y1 = y
        x2 = event.x
        y2 = event.y
        deltax = x2-x1
        deltay = y2-y1
        a = name.winfo_x() + deltax
        b = name.winfo_y() + deltay
        name.geometry("+%s+%s" % (a, b))

    name.overrideredirect(True)
    name.config(relief='solid',bd=1,bg='white')
    name.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy))
    frame=tk.Frame(name,width=sizex,height=80,relief='solid',bd=1,bg='black')
    frame.place(x=0,y=0)
    frame.bind("<ButtonPress-1>",StartMove)
    frame.bind("<ButtonRelease-1>",StopMove)
    frame.bind("<B1-Motion>",OnMotion)
    label=tk.Label(frame,text=title,font=('calibri',(titlesize)),bg='black',fg='white')
    label.place(x=10,y=15)
    button=tk.Button(frame,text='EXIT',font=('calibri',(13)),bg='red',relief='flat',bd=1,width=8,pady=3,command=name.destroy)
    button.place(x=1170,y=20)
    frame2=tk.Frame(name,width=sizex,height=20,relief='solid',bd=1,bg='black')
    frame2.place(x=0,y=sizey-20)

我的问题是我需要为我的模板中的一些标签小部件和按钮小部件更改一些属性,例如 bgcolortext。我知道我可以像这样在我的函数中添加我想要的其他属性

def Drag_Window(name,sizex,sizey,posx,posy,title,titlesize,propertyA,propertyB,...etc): 
........
........

但我想知道是否可以直接从我的主脚本访问小部件属性?反正我能做到吗?

类似这样的:

import module1 as md1
import Tkinter as tk

main_sizex=1280
main_sizey=750
main_posx=1
main_posy=1
main_title="Hello! This is a test"
main_titlesize=22
root=tk.Tk()
md1.Drag_Window(root, main_sizex, main_sizey, main_posx, main_posy, main_title, main_titlesize)
md1.button.config(bg='green') # <=
root.mainloop() 

【问题讨论】:

    标签: python function properties tkinter


    【解决方案1】:

    使用class

    ma​​in.py

    import Tkinter as tk
    
    import module1 as md1
    
    
    main_sizex = 1280
    main_sizey = 750
    main_posx = 1
    main_posy = 1
    main_title = "Hello! This is a test"
    main_titlesize = 22
    root = tk.Tk()
    window = md1.Drag_Window(root, main_sizex, main_sizey, main_posx, main_posy, main_title, main_titlesize)
    window.button.config(bg='green')
    root.mainloop() 
    

    module1.py

    import Tkinter as tk
    
    class Drag_Window:
        def __init__(self, name, sizex, sizey, posx, posy, title, titlesize):
            self.name = name
            name.overrideredirect(True)
            name.config(relief='solid', bd=1, bg='white')
            name.wm_geometry("%dx%d+%d+%d" % (sizex,  sizey,  posx,  posy))
            frame = tk.Frame(name, width=sizex, height=80, relief='solid', bd=1, bg='black')
            frame.place(x=0, y=0)
            frame.bind("<ButtonPress-1>", self.StartMove)
            frame.bind("<ButtonRelease-1>", self.StopMove)
            frame.bind("<B1-Motion>", self.OnMotion)
            label = tk.Label(frame, text=title, font=('calibri', titlesize), bg='black', fg='white')
            label.place(x=10, y=15)
            self.button = tk.Button(frame, text='EXIT', font=('calibri', 13), bg='red', relief='flat', bd=1, width=8, pady=3, command=name.destroy)
            self.button.place(x=1170, y=20)
            frame2 = tk.Frame(name, width=sizex, height=20, relief='solid', bd=1, bg='black')
            frame2.place(x=0, y=sizey-20)
    
        def StartMove(self, event):
            self.x = event.x
            self.y = event.y
    
        def StopMove(self, event):
            self.x = None
            self.y = None
    
        def OnMotion(self, event):
            x1 = self.x
            y1 = self.y
            x2 = event.x
            y2 = event.y
            deltax = x2 - x1
            deltay = y2 - y1
            a = self.name.winfo_x() + deltax
            b = self.name.winfo_y() + deltay
            self.name.geometry("+%s+%s" % (a, b))
    

    另一种方式(不推荐) - 在 Drag_Window() 函数中将小部件公开为全局变量。

    def Drag_Window(root, ....):
        global button
        ....
        button = Button(....)
    

    【讨论】:

    • 顺便说一句,name 不是好名字。请改用parentmaster
    • 哇!非常感谢 。我没想到你会写出整个答案......最初,我被课堂的概念所迷惑,但在阅读了你的例子之后,它让我的一些疑问变得清晰。再一次..谢谢:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 2016-04-17
    • 1970-01-01
    相关资源
    最近更新 更多