Tkinter将文本“live”插入文本框

2024-09-27 21:24:42 发布

您现在位置:Python中文网/ 问答频道 /正文

这里有点初学者:)

所以在过去的几天里,我一直在做一个相对简单的网页刮板,但是有一个特别的目标。也就是说,我想和特金特相处得更好

所以,我制作了一个devlog窗口,它只是一个独立的控制台类型的东西。但问题是我想在devlog窗口中插入文本“live”,而文本来自不同线程中的不同脚本。如何实现此功能?这个devlog窗口也运行在一个线程中,以及它旁边的其他3个脚本中。这是我目前掌握的代码:

import Manager as AM
import tkinter as tk
from time import sleep  # For some simple timing algorithms

Width = 700
Height = 500
FrameGeometry = str(Width) + "x" + str(Height)

# COLORS
LightGrey = "#D9D9D9"
DarkGrey = "#AAAAAA"

# Global variables.
ThreadsList = list()

def CreateDevLogWindow():
    global Width
    global Height

    ThreadTemp_ = str(AM.FileManager(ReadData=2))

    devlog = tk.Tk()  # Secondary Devlog Interface.
    FrameInfo = tk.Frame(master=devlog)
    FrameText = tk.Frame(master=devlog)
    ThreadText = tk.Label(master=FrameInfo, text="Total Threads: " + ThreadTemp_, bg="white")
    ThreadTextActive = tk.Label(master=FrameInfo, text="Active Threads: " + ThreadTemp_, bg="white")
    InfoText = tk.Text(FrameText, border=1, highlightthickness=1)

    devlog.title("Devlog: YourOptimalScrapper")
    devlog.geometry(str(Width) + "x" + str(Height))
    devlog.config(bg="white")

    FrameInfo.config(bg="white")
    FrameText.config(bg="white", padx=5, pady=5)

    FrameInfo.pack(side=tk.TOP, fill=tk.BOTH)
    FrameText.pack(side=tk.BOTTOM, expand=True, fill=tk.BOTH)

    ThreadText.grid(row=0)
    ThreadTextActive.grid(row=1)

    InfoText.pack(expand=True, fill=tk.BOTH)

    while True:
        if ThreadTemp_ != AM.FileManager(ReadData=2):
            ThreadTemp_ = str(AM.FileManager(ReadData=2))
            ThreadText.config(text="Total Threads: " + ThreadTemp_)
            ThreadTextActive.config(text="Active Threads: " + ThreadTemp_)

        devlog.update()

非常感谢您提供的任何帮助,请注意:下面还有更多代码,但我认为这并不是特别必要:)


Tags: textmasterconfigamwidthtkbgwhite
1条回答
网友
1楼 · 发布于 2024-09-27 21:24:42

首先,只需几行就可以在文本框中插入文本

def update_textbox(textbox, data):
    textbox.config(state=tk.NORMAL) # unlock the textbox
    textbox.insert(tk.END, "\n"+str(data)) # add newline and append the data
    textbox.config(state=tk.DISABLED) # lock back the textbox to readonly
    textbox.see(tk.END) # scroll to the bottom to see the last line

如果您的脚本位于不同的线程中,那么您可以创建一个文件作为数据的“载体”

当您需要向文本框写入数据时,只需在任何线程中将文本写入文件,并更新上述代码中的while循环即可读取此文件,如果文件不为空,则更新文本框

编辑:您不需要在此线程之外调用此函数。只需在while循环中检查是否必须将新数据添加到日志中

...
    while True:
        with open("carrier.txt", 'r') as f:
            content = f.read() # read carrier data
            if content: # if file isn't empty
               update_textbox(InfoText, content) # update the textbox with the data in the file
        open("carrier.txt", 'w').close() # clear the file to prevent reading the data twice

        if ThreadTemp_ != AM.FileManager(ReadData=2):
            ThreadTemp_ = str(AM.FileManager(ReadData=2))
            ThreadText.config(text="Total Threads: " + ThreadTemp_)
            ThreadTextActive.config(text="Active Threads: " + ThreadTemp_)

        devlog.update()

在你的另一个线程中

def update_log(data):
    with open("carrier.txt", 'a') as f: # append to the file
        f.write(str(data))

相关问题 更多 >

    热门问题