Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.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_Tkinter_Tkinter Layout - Fatal编程技术网

Python 如何在tkinter文本小部件中动态插入文本?

Python 如何在tkinter文本小部件中动态插入文本?,python,python-3.x,tkinter,tkinter-layout,Python,Python 3.x,Tkinter,Tkinter Layout,我想创建一个日志窗口,在其中显示错误或成功消息的记录。 请告诉我在当前应用程序的任何小部件的文本框中插入文本的任何解决方案 任何解决方案是否与我们使用的textvariable 目的: 假设我们有两个选项卡,其中一个我们正在下载一些东西,其中出现了一些错误,然后这个错误被插入到另一个选项卡的文本框中 我正在更新我的问题以获得更好的答案 文件结构: downloader.py 将tkinter作为tk导入 类下载窗口(tk.Frame): 定义初始化(自身,父级): super()。\uuuu

我想创建一个日志窗口,在其中显示错误或成功消息的记录。 请告诉我在当前应用程序的任何小部件的
文本框中插入文本的任何解决方案

任何解决方案是否与我们使用的
textvariable

目的: 假设我们有两个选项卡,其中一个我们正在下载一些东西,其中出现了一些错误,然后这个错误被插入到另一个选项卡的文本框中

我正在更新我的问题以获得更好的答案

文件结构:

downloader.py

将tkinter作为tk导入
类下载窗口(tk.Frame):
定义初始化(自身,父级):
super()。\uuuu init\uuuu(父级)
#################自我配置##########################
self.columnconfigure(0,权重=1)
###############入口################################
self.entry=tk.entry(self)
self.entry.grid(行=0,列=0,sticky='nsew')
self.entry.insert(0,'I am error send me to Logs…')
################钮扣#################################
self.button=tk.button(self,text='Send to Log')
self.button.grid(行=1,列=0,sticky='nsew')
insert.py

“”“
帮助我在此模块中为downloader中的按钮编写函数
"""
logs.py

将tkinter作为tk导入
类日志窗口(tk.Frame):
定义初始化(自身,父级):
super()。\uuuu init\uuuu(父级)
#################自我配置##########################
self.rowconfigure(0,权重=1)
self.columnconfigure(0,权重=1)
self.text\u box=tk.text(self,wrap=None,bg='black',font='roboto 14 bold')
self.text\u box.grid(行=0,列=0,sticky='nsew')
self.scroller=tk.Scrollbar(self,command=self.text\u box.yview,orient='vertical')
self.text\u box.configure(yscrollcommand=self.scroller.set)
self.scroller.grid(行=0,列=1,sticky='nse')
self.text\u box.tag\u configure('welcome',前台='white',后台='black'))
self.text\u box.tag\u configure('error',front='red')
self.text\u box.tag\u configure('success',front='green'))
self.text_box.insert('end','>>>>欢迎使用日志窗口,'Welcome')
self.text_box.insert('end','\n>>>已完成,'success')
self.text_box.insert('end','\n>>>数据下载中出现错误,'error')
leunter.py

将tkinter作为tk导入
从tkinter导入ttk
从Test.logs导入日志窗口
从Test.downloader导入下载窗口
root=tk.tk()
基本选项卡=ttk.笔记本(根)
基本选项卡网格(行=0,列=0,sticky='nsew')
基本选项卡。添加(下载窗口(基本选项卡),text='Download')
基本选项卡。添加(日志窗口(基本选项卡),text='Logs')
root.mainloop()
截图:

最终更新和目标实现 添加到
downloader.py

self.button.config(命令=self.create\u log)
def创建_日志(自):
写入日志(self.entry.get())
添加到
insert.py

def写入日志(文本):
打开('logs_data.txt','a')作为日志:
log.write(f'\n{text}')
添加到
logs.py

self.show_log()
def显示日志(自我):
全局文件\u名称,缓存的\u戳记
stamp=os.path.getmtime(文件名)
如果是邮票!=邮戳:
打开(文件名为“r”)作为日志:
data=log.readlines()
self.text_box.insert('end',f'\n{data[-1]}','success')
缓存的戳=戳
self.after(1000,self.show_log)
结论
我在每个login.txt文件中添加日志,并在每一秒中读取它们。从LogWindow和检测更改。如果发生更改,则插入文本小部件。

您的问题非常不清楚。我不知道这是语言障碍还是术语问题。我猜您实际上并不是在问如何将文本插入到小部件中,因为这是有明确文档记录的,而是问如何在一个类中创建小部件并从另一个类访问它

如果是这种情况,那么我的建议是做两件事:在
LogWindow
中创建一个方法,将文本插入文本小部件,然后从应用程序中的任何其他地方调用该方法

在LogWindow中创建日志记录方法 第一步是在
LogWindow
中创建一个函数,其他对象可以使用该函数向日志添加数据。以下示例创建一个
info
方法,该方法接受字符串并将其添加到文本小部件中:

class LogWindow(tk.Frame):
    def __init__(self, parent):
        ...
        self.text_box = tk.Text(...)
        ...
        
    def info(self, message):
        self.text_box.insert("end", message)
        if not message.endswith("\n"):
            self.text_box.insert("end", "\n")
修改DownloadWindow以接受LogWindow实例 接下来,您需要确保其他代码可以调用此方法。您可以通过设置全局变量、创建所有选项卡都可以访问的全局控制器或将引用传递给其他选项卡来实现这一点

可以说,最简单的方法就是将实例传递给其他类。您可以通过首先修改
DownloadWindow
以接受日志窗口作为参数来实现这一点:

class DownloadWindow(tk.Frame):
    def __init__(self, parent, logwindow):
        super().__init__(parent)
        self.logger = logwindow
完成此操作后,可以使用类中的任何位置使用
self.logger.info(“…”)
向日志窗口发送消息

将LogWindow实例传递给DownloadWindow 最后一步是将
LogWindow
的实例传递到
DownloadWindow
。这需要首先创建
LogWindow
的实例,保存引用,并将该引用传递给
DownloadWindow

log_window = LogWindow(base_tab)
download_window =  DownloadWindow(base_tab, log_window)

base_tab.add(download_window, text='Download')
base_tab.add(log_window, text='Logs')

您可以通过调用
self.text\u box.insert()
,将文本插入到它中-就像您在
窗口中所做的一样。@martineau init\uu()
方法,@martineau sir我无法在插入模块中创建对象,因为我多次使用插入模块。是否有任何基于功能的解决方案。尽管您进行了更新,您的问题仍然不清楚。我想我知道如何创建一个类似
Text
的小部件,它支持
textvariable=
选项。但是(仍然)不清楚哈是如何做到的