Как вставить текст из другого файла в tkinter без создания нового окна - PullRequest
0 голосов
/ 08 января 2019

Я уже некоторое время пытаюсь разобраться с этой проблемой, но я в тупике. Я работаю над текстовой сюжетной игрой для класса, и у меня появилась идея поместить сценарий в другой файл, чтобы им было проще управлять. Это означает, что у меня есть основная функция, которая запускает графический интерфейс, который принимает ввод, отправляет его в файл сценария, файл сценария решает, какой текст должен отображаться, и вызывает функцию в основной функции, которая отображает выбранный текст.

Моя проблема в том, что каждый раз, когда вызывается функция main для отображения текста, создается новое окно с этим текстом. Эта проблема возникает только тогда, когда я вызываю функцию извне 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()

SCRIPT

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 голосов
/ 08 января 2019

Не рекомендуется, чтобы основная функция вызывала функцию сценария, которая затем будет вызывать функцию основного сценария. Чтобы воплотить в жизнь вашу идею, которую вы упомянули в начале, чтобы отделить часть «сценария», мы должны полностью отделить ее, чтобы она стала строительным блоком, который можно будет использовать позже при необходимости. Отправьте скрипт на обработку и верните результат обработки обратно на главную, которая обрабатывает печать / стирание вещей из окна GUI.

Главная * * 1005 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!")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...