在 ipython 笔记本中集成 tkinter 事件循环

ph-*_*ett 5 python tkinter event-loop ipython jupyter-notebook

使用像这样的简单 tkinter gui:

import tkinter as tk       

class Application(tk.Frame):              
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)   
        self.grid()                       
        self.createWidgets()

    def printHello(self):
        print("Hello")

    def createWidgets(self):
        self.quitButton = tk.Button(self, text='Quit',
            command=self.quit)            
        self.quitButton.grid(row=1,column=0)    
        self.printButton = tk.Button(self, text='Print',command=lambda: self.printHello())         
        self.printButton.grid(row=1,column=1) 
app = Application()                        
app.master.title('Sample application')     
app.mainloop()
Run Code Online (Sandbox Code Playgroud)

我试图按照此文档将事件循环与 ipython 笔记本的内核连接:https://ipython.org/ipython-doc/3/config/eventloops.html

但我似乎不太明白它是如何工作的:@register_integration('tk')

如何准确连接事件循环?如果我这样做,我可以用连接的事件循环做什么?

And*_*ang 0

我相信你想做的是这样的:

from ipykernel.eventloops import register_integration

@register_integration("tk")
def loop_tk(kernel):
    import tkinter as tk

    """Start a kernel with the Tk event loop."""
    class Application(tk.Frame):              
        def __init__(self, master=None):
            tk.Frame.__init__(self, master)   
            self.grid()                       
            self.createWidgets()

        def printHello(self):
            print("Hello")

        def createWidgets(self):
            self.quitButton = tk.Button(self, text='Quit',
                command=self.quit)            
            self.quitButton.grid(row=1,column=0)    
            self.printButton = tk.Button(self, text='Print',command=lambda: self.printHello())         
            self.printButton.grid(row=1,column=1)


    kernel.window = tk.Tk()
    kernel.app = Application(kernel.window)
    kernel.window.title('Sample application')

    kernel.window.mainloop()

%gui tk
Run Code Online (Sandbox Code Playgroud)

首先,您需要导入该函数(我认为该函数没有在任何地方记录)。

其次,您需要注册集成并定义函数loop_tk。您必须运行Tk实例而不是Frame,因为Frame没有函数mainloop

最后,使用魔法gui tk来表明您正在创建一个 Tk 事件循环。