为什么我的tkinter应用程序有一个无关紧要的' tk'窗口?

时间:2015-11-30 02:59:18

标签: python python-3.x tkinter

我正在学习Python& Tkinter的。我对他们两个都很陌生。

我试图为Raspberry Pi制作一个Python应用程序,模仿来自Fallout 4的PipBoy 3000 Mark IV。

目前,我正在制作该程序的介绍动画部分,该部分只是简单地为一个文字动画一次一个字符。

我在Linux(ChromeOS via Crouton)和Windows上使用Python 3.2。我已经完成了几个tkinter教程,但我必须在这里遗漏一些东西。如果有人能指出我正确的方向,我会很感激。

main.py:

from tkinter import *
from tkinter import ttk

from introAnimation import *

# FUNCTIONS


def setup_root():
    global root
    root = Tk()
    root.title("PipBoy 3000 Mark IV")
    root.geometry("800x480")
    root.bind("<Escape>", lambda e: e.widget.quit())


def setup_intro():
    global introframe
    introframe = ttk.Frame(root, style='pip.TFrame', padding="3 3 12 12")
    print('introframe created.')
    introframe.grid(column=0, row=0, sticky=(N, W, E, S))
    introframe.columnconfigure(0, weight=1)
    introframe.rowconfigure(0, weight=1)
    ttk.Label(introframe, width=200, textvariable=introHeading).grid(column=4, row=1, sticky=(W, E))
    global dynamic_label
    dynamic_label = ttk.Label(introframe, style='pip.TLabel', textvariable=temp_label).grid(column=1, row=2)
    print('dynamnic_label created')

def print_label_slowly(message):
    array = list(message)
    print('print_label_slowly was called')
    for char in array:
        print("in loop, char: %s" % char)
        text = temp_label.get()
        text += char
        introframe.after(600)
        temp_label.set(text)
        introframe.update_idletasks()


# MAIN
if __name__ == "__main__":
    # set up frame style
    pip_frame = ttk.Style()
    pip_frame.configure('pip.TLabel', background='black', foreground='green')
    pip_frame.configure('pip.TFrame', background='black', foreground='green')
    # set up root geometry
    setup_root()

    # set up intro
    temp_label = StringVar()
    setup_intro()
    introframe.focus()
    for postMessage in introAnimArray:
        print_label_slowly(postMessage)
    root.update_idletasks()
    # print_label_slowly('test')
    root.mainloop()

部分字符串来自IntroAnimation.py IntroAnimation.py:

introAnimArray = [
    "LOADER V1.1",
    "EXEC VERSION 41.10",
    "64K RAM SYSTEM",
    "38911 BYTES FREE",
    "NO HOLOTAPE FOUND",
    "LOAD ROM(1). DEITRIX 303"
]

introHeading = "*************** PIP-OS(R) V7.1.0.8 ***************"

initialiseString = 'INITIATING'

问题:

  • 我创造的风格似乎并没有应用。

  • 窗口布局类型最终成为两个独立的窗口,一个很大,一个小的时候,我预计内插框会最终作为一种层坐在根上。

  • 在标签更新时看不到标签,但我可以从我的打印命令中看到脚本正在正确处理数据。

修改删除了额外的问题,专注于关键问题。 Result of issues

1 个答案:

答案 0 :(得分:1)

代码太多,问题太多。这应该是三个单独的问题,每个问题都有一小段代码。阅读并采取此SO help page

让我们对标有'tk'的无关小窗口提出这个问题。你假设它与introframe有关,但你不知道。如果您已经逐步开发了代码,那么在您进行测试时,您会注意到哪个添加使其显示出来。鉴于你拥有的东西,删除直到问题消失。

这就是我所做的。我在setup_rootroot.mainloop之间注释了所有内容。仍然有两个窗口。删除更多,事实证明,如果没有一个窗口,style()会创建一个空白tk窗口。如果你在main子句中使用那一行运行代码,你会立即看到问题。首先创建root,然后问题就消失了。

我用了3.5。如果可以使用RPy,请使用比3.2更新的东西。