我想设置 PYQT Qtextedit 小部件并使用它来监视另一个应用程序活动日志(如 Linux 上的 tail -f)。长期来看,我担心它运行时间太长,并且使用大量内存来构建文本。是否可以设置限制,以便删除经过 x 行的文本?从我发现它似乎需要定制工作,如果存在,我想找到一个限制器设置。
如果我将一个 25MB/190,000 行的文本文件转储到一个文本小部件中,该过程会很快完成,但之后我仍然看到 python.exe 使用 50% CPU 一分钟左右。文件越大,CPU 使用率下降到 0% 所需的时间就越长。当我开始将多个文件加载到不同的文本小部件中时,它们会立即加载到小部件中,但 CPU 保持在 50% 并且 GUI 运行得非常慢,直到它在后端完成任何操作。有人可以向我解释为什么 CPU 仍在使用中,如果文本已经在小部件中,为什么它会影响性能?它需要做什么?有什么办法解决这个问题吗?
from tkinter import *
file = r"C:\path\to\large\file.txt"
def doit():
with open(file, 'r') as f:
txt.insert('end', ''.join(f))
f.close()
main = Tk()
txt = Text(main)
txt.grid(row=0)
btn = Button(main, text="click here", command=doit)
btn.grid(row=1, columnspan=2)
main.mainloop()
Run Code Online (Sandbox Code Playgroud)
我想可能是因为我逐行处理文件而不是将整个文件加载到 RAM 中。我试过 readlines() 但我得到了相同的结果。
import sys
from PyQt5.QtWidgets import QSystemTrayIcon, QApplication, QMenu
from PyQt5.QtGui import QIcon
class autoparse():
def __init__(self):
self.main()
def main(self):
app = QApplication(sys.argv)
self.trayIcon = QSystemTrayIcon(QIcon("icons\icon-windowed.ico"), app)
self.menu = QMenu()
self.autopconfig = self.menu.addAction('Config')
self.autopconfig.triggered.connect(self.swapicon)
self.trayIcon.setContextMenu(self.menu)
self.trayIcon.show()
sys.exit(app.exec_())
def swapicon(self):
QSystemTrayIcon.setIcon(QIcon("icons\python.ico"))
test1 = autoparse()
Run Code Online (Sandbox Code Playgroud)
我可以让初始图标设置得很好,我可以通过为应用程序创建 2 个图标然后执行 self.trayIcon.hide() 和 self.newicon.show() 来解决这个问题,但我不认为这是正确的方法。
Pycharm 显示一条通知,上面写着“预期的 QSystemTrayIcon,获得了 QIcon”,但如果我QIcon与之交换QSystemTrayIcon,则它会说Qicon丢失。SOOOOOO 我将其更改为QSystemTrayIcon(QIcon("icons\python.ico"),但它仍然显示QIcon未填充。问题检测似乎一直在循环。
当我运行 swapicon 函数时,按原样运行代码会给出“setIcon (self, QIcon): unbound 方法的第一个参数必须具有类型 'QSystemTrayIcon'”。如果我删除 QIcon,使其只是 setIcon(文件),那么我会得到“setIcon(self,QIcon):没有足够的参数”
设置一个从托盘图标启动不同应用程序的工具包,我需要能够打开配置窗口,然后在不关闭整个应用程序的情况下关闭它。
import sys
from PyQt5.QtWidgets import QSystemTrayIcon, QApplication, QMenu, qApp, QMainWindow, QPushButton, QLabel, QLineEdit
from PyQt5.QtGui import QIcon
from PyQt5 import QtCore
class autoparse():
def __init__(self):
self.main()
def main(self):
app = QApplication(sys.argv)
self.trayIcon = QSystemTrayIcon(QIcon("icons\icon-windowed.ico"), app)
self.menu = QMenu()
self.trayIcon.setContextMenu(self.menu)
self.autopconfig = self.menu.addAction('Config')
self.autopconfig.triggered.connect(self.configwindow)
exitaction = self.menu.addAction("Exit")
exitaction.triggered.connect(qApp.quit)
self.trayIcon.show()
sys.exit(app.exec_())
def configwindow(self):
try:
self.config = QMainWindow()
self.config.setWindowTitle('Configuration')
self.config.setGeometry(300, 300, 640, 480)
self.lbl = QLabel('Directory: ', self.config)
self.lbl.setGeometry(QtCore.QRect(10, 20, 200, 20))
self.pathsel = QLineEdit(self.config)
self.pathsel.setMaxLength(250)
self.pathsel.setText('path here')
# self.pathsel.selectAll()
self.pathsel.setGeometry(QtCore.QRect(10, 50, …Run Code Online (Sandbox Code Playgroud) 我目前有一个日志解析器,可将用户信息放入“文本”小部件中。如果插入到“文本”小部件中的行具有关键字,则该行将突出显示为蓝色。如果单击该行,我想在执行的事件函数中使用该行中的文本。
因为我正在使用标签的config来将线条涂成蓝色,所以我也不能复制单击的文本吗?
代码示例:
from tkinter import *
def callback(event):
window = Toplevel()
window.overrideredirect(1)
window.geometry("200x100+{0}+{1}".format(event.x_root-1, event.y_root-12))
label = Label(window, justify="left", text="Username: value \nLocation: value \nAddress: value \nSecurity Level: value")
label.grid()
window.bind("<Leave>", lambda e: window.destroy())
root = Tk()
text = Text(root)
text.insert(END, "Click here", "tag")
text.pack()
text.tag_config("tag", foreground="blue")
text.tag_bind("tag", "<Button-1>", callback)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
如何获取被单击的用户名并在函数中使用它?我只想将用户名设置为变量并使用它,而我只是想念如何做到这一点。
from tkinter import *
main = Tk()
def flipper(event):
# I'd like to do this:
#if widgetname == switcher:
#do stuff
#if widgetname == switcher1:
#do stuff
return
switcher = Label(main, bg='white', text="click here", font="-weight bold")
switcher.grid()
switcher.bind("<Button-1>", flipper)
switcher1 = Label(main, bg='white', text="click here", font="-weight bold")
switcher1.grid()
switcher1.bind("<Button-1>", flipper)
switcher2 = Label(main, bg='white', text="click here", font="-weight bold")
switcher2.grid()
switcher2.bind("<Button-1>", flipper)
switcher3 = Label(main, bg='white', text="click here", font="-weight bold")
switcher3.grid()
switcher3.bind("<Button-1>", flipper)
switcher4 = Label(main, bg='white', text="click here", font="-weight bold") …Run Code Online (Sandbox Code Playgroud)