导入时Tkinter应用程序的行为与直接执行时不同

时间:2014-11-22 13:24:20

标签: python python-2.7 tkinter tk

我正在尝试构建一个GUI。

当我直接执行应用程序时(即双击python文件),我得到一个不同的结果(控制台输出)来导入它(mainloop)。

我希望它能提供以下控制台输出:

c
d
e
f
g - from app

因为我希望主循环在作为模块导入后可以访问。

我正在尝试通过将其作为模块导入的外部文件来控制输入和输出。

当我运行文件时,我得到了预期的输出,但是当我将它作为模块导入时,它似乎运行主循环,因为我得到了一个Tkinter主循环窗口输出。

以下是代码:

class Application(Frame):

    def __init__(self, master = None):
        Frame.__init__(self, master)

        self.text = Lines()
        self.text.insert("\n\n\n\n\n")

        self.waitingForInput = False
        self.inText = ""

        self.pack()
        self.widgets()

    def widgets(self):
        self.L1 = Label(self)
        self.L1["text"] = self.text.bottomLines
        self.L1.pack(side = "top")

        self.E1 = Entry(self)
        self.E1["width"] = 40
        self.E1.pack(side = "top")

        self.B1 = Button(self)
        self.B1["text"] = "Enter",
        self.B1["command"] = self.giveInput
        self.B1.pack(side = "top")

    def giveInput(self):
        if self.waitingForInput:
            self.inText = self.B1.get()
            self.waitingForInput = False

    def getInput(self, output):
        giveOutput(output)

        self.waitingForInput = True
        while True:
            time.sleep(0.1)
            if not self.waitingForInput:
                break
        return self.inText

    def giveOutput(self, output):
        self.text.insert(output)
        self.L1["text"] = self.text.bottomLines
        print self.text.bottomLines + " - from app"

root = Tk()
app = Application(master = root)
app.giveOutput("a \n b \n c \n d \n e \n f \n g")

Lines类本质上是字符串中的一堆文本行,使用insert(x)堆叠更多,并使用bottomLines访问堆栈的最后五行。

回到主题,当作为模块导入时,它运行主循环,标签包含我假设的5个空行,一个输入框和"Enter"按钮。我不想要这个。我想要像我之前显示的那样直接运行文件时的结果。

我只希望在调用app.mainloop方法时显示该框。

我做错了什么,怎么回事错,怎么纠正呢?

1 个答案:

答案 0 :(得分:3)

这仅在模块直接运行时运行,而不是在导入时运行:

if __name__ == "__main__":
    root = Tk()
    app = Application(master = root)
    app.giveOutput("a \n b \n c \n d \n e \n f \n g")