如何在tkinter中从其他文件插入文本而无需创建新窗口

时间:2019-01-08 18:33:34

标签: python class tkinter

我已经尝试解决这个问题已有一段时间了,但是我很沮丧。 我正在上课的一款基于文本故事的游戏,我的想法是将脚本放入另一个文件中,以使其易于管理。这意味着我具有运行GUI的主要功能,该GUI接受输入,将其发送到脚本文件,脚本文件决定需要显示哪些文本,并在显示所选文本的主函数中调用一个函数。 / p>

我的问题是,每次调用main的显示文本的功能时,都会使用该文本创建一个新的窗口。仅当我从外部main调用函数时,才会发生此问题。 我需要将输出从单独的文件显示在现有窗口上,而不是创建一个新窗口。

我的代码在这里(主要在顶部,脚本在底部):

主要

from tkinter import *
import script


class GUI(Frame):
    def __init__(self):
    self.root.geometry("300x400")

    Frame.__init__(self, self.root)
    self.create_widgets()


    def create_widgets(self):
        self.grid()
        self.text = Text(self, height=10, width=40, fg="black", bg="dark khaki")  # Output box
        self.vsb = Scrollbar(self, orient="vertical",command=self.text.yview)  # Scrollbar
        self.text.configure(yscrollcommand=self.vsb.set)
        self.text.grid(column=0, row=0)

        self.root.bind('<Return>', self.input)  # I forgot to mention, I have the enter key set to returning whatever's in the input box

        self.submit = Entry(self, width=30, bg="grey")
        self.submit.grid(column=0, row=1)  # input box


    def input(self, event):
        inp = self.submit.get()  # get what's in the input box
        self.submit.delete(0, END)  # clear the output box
        script.Script().inputP2(inp)  # sending the input to


    def insert(self, indent, inserting):
        if indent:  # I have two different settings to make inserting text easier
            self.text.insert(END, "\n{}".format(inserting))
        if not indent:
            self.text.insert(END, inserting)
        self.text.see("end")  # jump to the bottom of the output box


    def start(self):
        self.insert(False, "Game by me")
        self.root.mainloop()


    def __str__(self):
        return str(self)


if __name__ == "__main__":
    GUI().start()

脚本

import main
from tkinter import *

class Script():
    def __init__(self):
        pass

    def inputP2(self, inp):
        if inp == "try":
            main.GUI().insert(False, "sucess!")

        # The real script is much longer, this is just an example

1 个答案:

答案 0 :(得分:0)

让主函数调用脚本函数,然后再调用主脚本函数不是一个好主意。为了执行您在开头提到的将“脚本”部分分开的想法,我们应该将其完全分开,以便它是一个构建基块,以后可以在需要时再次使用。让脚本进行处理,然后返回处理结果回到main,该处理从GUI窗口处理事物的打印/擦除。

主要

def input(self, event):
    inp = self.submit.get()  # get what's in the input box
    self.submit.delete(0, END)  # clear the output box
    result = script.Script().inputP2(inp)  # sending the input 
    self.insert(result)

脚本

# remove importing of main and tkinter in "script"
def inputP2(self, inp):
    if inp == "try":
        return (False, "sucess!")