Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带类的Python Tkinter_Python_Python 3.x_Oop_Tkinter - Fatal编程技术网

带类的Python Tkinter

带类的Python Tkinter,python,python-3.x,oop,tkinter,Python,Python 3.x,Oop,Tkinter,尝试开发一个工作应用程序,我希望将UI和主控制器类代码分开。我应该如何处理这个问题 我已经创建了MainUi类 class MainUi: store_number = '' tld_date = '' def __init__(self, root): self.root = root root.title("TacoBell TLD Tool") self.store_number = IntVar() self.tld_date = IntVar()

尝试开发一个工作应用程序,我希望将UI和主控制器类代码分开。我应该如何处理这个问题

我已经创建了MainUi类

class MainUi:
store_number = ''
tld_date = ''

def __init__(self, root):
    self.root = root
    root.title("TacoBell TLD Tool")
    self.store_number = IntVar()
    self.tld_date = IntVar()

    self.lblstore_number = Label(root, text="Store Number (XXXXXX): ")
    self.lbltld_date = Label(root, text="TLD Date(MM/DD/YYYY): ")

    self.lblstore_number.grid(row=0, sticky=E)  # Sticky align text North(N), East(E), South(S), West(W0
    self.lbltld_date.grid(row=1, sticky=E)

    self.entStore = Entry(self.root, textvariable=self.store_number)
    self.entDate = Entry(self.root, textvariable=self.tld_date)

    self.entStore.grid(row=0, column=1)
    self.entDate.grid(row=1, column=1)
我需要定义getter和setter吗?我希望这些入口存储在main类的两个变量中,这样我就可以将main类中的变量传递给其他函数

import paramiko
import os
import csv
import tools
from ui import MainUi
from tkinter import *


root = Tk()
ui = MainUi(root)
# get store number and date data from UI.py and store them as variables here 
root.mainloop()

是的,您可以通过更改类变量
store\u number
tld\u date
将它们分开。为此,您需要从入口框中获取数字并将其保存为变量。我们可以通过调用
self.store\u number=self.entStore.get()
self.tld\u date=self.entDate.get()

MainUI.py 我首先更改了类的名称,这样文件名和类名就不会冲突。然后我创建了一个名为
self.confirm
的按钮,并将其命令设置为
self.save
。此函数将两个变量存储为
storeNumber
tldDate
,然后将类变量设置为已输入的值并销毁根窗口

Controller.py 因为我们销毁了根实例,所以返回了
mainloop()
函数,这意味着它下面的任何代码都将运行。只要UI是打开的,它下面的代码就不会运行。因此,当根窗口关闭时,它下面的代码将运行,并保存这两个变量供以后使用。您应该在注释掉的地方添加一些错误检查代码


使用.pack() 我个人不使用
.grid()
,因为is可能会有点混乱。相反,我喜欢使用
.pack()
和封装。如果您想改用
.pack()
的话,这里有另一个
\uuuu init\uuuu
的工作原理是一样的。我还使GUI在这个
\uuuu init\uuuuu
上看起来不那么标准,并使用了一些TacoBell颜色:)


最好的方法是使用组件。使用tkinter,您应该通过扩展
Frame
类来定义组件。因此,您的代码应该如下所示:

class StoreForm(tkinter.Frame):
    store_number = ''
    tld_date = ''

    def __init__(self, root, **kw):
        super().__init__(**kw)
        root.title("TacoBell TLD Tool")
        self.store_number = tkinter.IntVar()
        self.tld_date = tkinter.IntVar()

        self.lblstore_number = tkinter.Label(self, text="Store Number (XXXXXX): ")
        self.lbltld_date = tkinter.Label(self, text="TLD Date(MM/DD/YYYY): ")

        self.lblstore_number.grid(row=0, sticky=E)  # Sticky align text North(N), East(E), South(S), West(W0
        self.lbltld_date.grid(row=1, sticky=E)

        self.entStore = tkinter.Entry(self, textvariable=self.store_number)
        self.entDate = tkinter.Entry(self, textvariable=self.tld_date)

        self.entStore.grid(row=0, column=1)
        self.entDate.grid(row=1, column=1)
注意,
root
参数不是您的根,而是此框架的预期容器

这样,您就拥有了一个独立的可重用图形组件。该组件管理视图逻辑(显示小部件,如果需要,它们之间的交互),但不管理应用程序逻辑,这是控制器的工作。但要使用该控制器,您应该能够从该组件获取数据和/或提供一些数据。为此,您应该添加方法。即使我使用相似的名字,我也不会称他们为接受者和接受者

    def get_data(self):
        return self.store_number.get(), self.tld_date.get()

    def set_data(self, store_number_value, tld_date_value):
        self.store_number.set(store_number_value)
        self.tld_date.set(tld_date_value)
现在,在主模块中,您可以添加如下内容

MAIN_UI = tkinter.Tk()
form = StoreForm(MAIN_UI).pack()
我让您选择是在模块的根目录下还是在类中进行。这是控制器应该在的地方。控制器是您的业务逻辑位于图形组件之外的组件

使用框架可以:

  • 将UI逻辑与业务逻辑分开
  • 混合布局(表格框架中的网格,组件流的包装外部)
class StoreForm(tkinter.Frame):
    store_number = ''
    tld_date = ''

    def __init__(self, root, **kw):
        super().__init__(**kw)
        root.title("TacoBell TLD Tool")
        self.store_number = tkinter.IntVar()
        self.tld_date = tkinter.IntVar()

        self.lblstore_number = tkinter.Label(self, text="Store Number (XXXXXX): ")
        self.lbltld_date = tkinter.Label(self, text="TLD Date(MM/DD/YYYY): ")

        self.lblstore_number.grid(row=0, sticky=E)  # Sticky align text North(N), East(E), South(S), West(W0
        self.lbltld_date.grid(row=1, sticky=E)

        self.entStore = tkinter.Entry(self, textvariable=self.store_number)
        self.entDate = tkinter.Entry(self, textvariable=self.tld_date)

        self.entStore.grid(row=0, column=1)
        self.entDate.grid(row=1, column=1)
    def get_data(self):
        return self.store_number.get(), self.tld_date.get()

    def set_data(self, store_number_value, tld_date_value):
        self.store_number.set(store_number_value)
        self.tld_date.set(tld_date_value)
MAIN_UI = tkinter.Tk()
form = StoreForm(MAIN_UI).pack()