0

我有一个用 IDLE3.3 和 tkinter 编写的程序,我不知道在哪里放置 mainloop()。如果您单击上下文菜单中的“新笔记”,该程序会创建一个系统托盘图标,该图标会创建一个小笔记。如果 Note 末尾有“self.root.mainloop()”行。init (),注解显示出来,但只有一个注解。如果我创建第二个,第一个音符就死了,没有进一步的反应。但是,如果我不在 init 方法中调用 mainloop(),我会看到创建了几个注释,因为它是在 shell 中打印的。所以问题是,我应该在哪里放置主循环,以便显示每个新创建的 notw 并正常工作?抱歉这个可能很愚蠢的问题,但我无法弄清楚。

from tkinter import *
import sys
from PyQt4.QtGui import *
import threading


class Note():

    yellow=["#e7e37c","#d9d574"]

    def __init__(self,noteset=None, properties=None):
        self.root=Tk()
        self.noteset=noteset
        self.properties=properties
        self.screen_width = self.root.winfo_screenwidth()      
        self.screen_height = self.root.winfo_screenheight()    
        print("No initial properties to load => creating new note")
        self.notecolor=self.yellow[0]
        self.gripcolor=self.yellow[1]
        self.root.overrideredirect(1) 
        self.text=""
        self.font="arial"
        self.fontsize=10  
        self.sizeX=250 
        self.sizeY=200
        self.posX=int(self.screen_width/2 - self.sizeX/2)   
        self.posY=int(self.screen_height/2 - self.sizeY/2)
        self.root.wm_geometry("%sx%s+%s+%s"   %(self.sizeX,  self.sizeY,  self.posX,  self.posY) )           
        self.root.wm_attributes("-topmost",1)
        self.GUI()
        self.bindings()

        self.root.mainloop()

    def bindings(self):
        self.frmGRIP.bind("<ButtonPress-1>", self.StartMove)
        self.frmGRIP.bind("<ButtonRelease-1>", self.StopMove)
        self.frmGRIP.bind("<B1-Motion>", self.OnMotion)

    def StartMove(self, event):
        self.startx = event.x
        self.starty = event.y
    def OnMotion(self, event):           
        mousex,mousey=self.root.winfo_pointerxy()
        self.root.geometry("+%s+%s" % (mousex-self.startx, mousey-self.starty))
    def StopMove(self, event):
        self.posX = self.root.winfo_x()
        self.posY = self.root.winfo_y()

    def GUI(self):                 
        self.frmTOP=Frame(master=self.root,height=15)
        self.frmBOTTOM=Frame(master=self.root,width=300,height=300)
        self.frmGRIP=Frame(self.frmTOP,bg=self.gripcolor,height=15)
        self.frmRESIZE=Frame(self.frmBOTTOM,width=300,height=10)
        self.frmTEXT=Frame(self.frmBOTTOM,bg=self.notecolor,width=300,height=300)
        self.frmRESIZE_empty=Frame(self.frmRESIZE,bg=self.notecolor,height=10)
        self.frmRESIZE_grip=Frame(self.frmRESIZE,bg=self.gripcolor,width=10,height=10)

        self.frmTOP.pack(fill=X,expand=NO)
        self.frmBOTTOM.pack(side=BOTTOM,fill=BOTH,expand=YES) 
        self.frmGRIP.pack(side=LEFT,fill=X,expand=YES)
        self.frmRESIZE.pack(side=BOTTOM,fill=X)        
        self.frmTEXT.pack(side=BOTTOM,fill=BOTH,expand=YES)
        self.frmRESIZE_empty.pack(side=LEFT,fill=X,expand=YES)
        self.frmRESIZE_grip.pack(side=LEFT,expand=NO)

        self.T=Text(self.frmTEXT,
                    height=6,width=30,
                    bd=0,wrap=WORD,pady=3,padx=5,
                    bg=self.notecolor,undo=1,
                    font=(self.font,self.fontsize)
                    )
        self.T.insert(END,self.text)
        self.T.pack(fill=BOTH,expand=YES)        

class Noteset():
    def __init__(self):
        self.notes = []
    def newNote(self):
        note=Note(noteset=self)
        self.notes.append(note)
        print(self.notes)
        return note

class Main():
    def __init__(self):
        self.N=Noteset()
        app = QApplication(sys.argv)

        trayIcon = QSystemTrayIcon(QIcon("J:\\python\\SimpleNotes.ico"), app)
        menu = QMenu()

        ActionNewNote = menu.addAction("new Note")
        ActionNewNote.triggered.connect(self.newNote)
        trayIcon.setContextMenu(menu)
        trayIcon.show()

        app.exec()

    def newNote(self):
        self.N.newNote()


Main()
4

2 回答 2

1

混合 gui 框架并不是一个好主意,因为每个主循环都相互阻塞,最好将整个事情编码成一个或另一个。

于 2013-05-25T14:05:04.570 回答
1

你不能成功地同时使用 Qt 和 Tkinter。此外,如果您从上面删除 Qt,您还会遇到额外的问题,即您不应创建多个Tk.

要回答您的具体问题,mainloop通常是您执行的最后一行代码。由于它是一个无限循环,因此您调用之后的任何代码mainloop都不会执行,直到主窗口被销毁。

Tkinter 应用程序的正常结构是这样的:

import Tkinter as tk
class MyApp(...):
    def __init__(self, root, ...):
        ...
    ...

root = tk.Tk()
myApp(root)
root.mainloop()
于 2013-05-25T14:53:07.317 回答