Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
568 views
in Technique[技术] by (71.8m points)

python - Is there any way to use Tkinter with Google Colaboratory?

I have a code where I'm trying out different Tkinter widgets, but Colab sends back an error saying that there's no display name or variable. The exact error message looks something like what follows:

TclError                                  Traceback (most recent call last)
<ipython-input-5-7b43f8be599d> in <module>()
----> 1 form = tk.Tk()
   /usr/lib/python3.6/tkinter/__init__.py in __init__(self, screenName, baseName, className, useTk, sync, use)
   2021                 baseName = baseName + ext
   2022         interactive = 0
-> 2023         self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
   2024         if useTk:
   2025             self._loadtk()
TclError: no display name and no $DISPLAY environment variable

Is there any way to work around this? The code goes something like this:

import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
from tkinter import filedialog
def fOpen(): 
    print(filedialog.askopenfilename(initialdir = "/",title = "Open file",filetypes = (("Python files","*.py;*.pyw"),("All files","*.*"))))
def ExitF(): 
    form.destroy()
def fSave(): 
    print(filedialog.asksaveasfilename(initialdir = "/",title = "Save as",filetypes = (("Python files","*.py;*.pyw"),("All files","*.*"))))
form = tk.Tk()
form.title("Colab Form")
menubar = tk.Menu(form)
filemenu = tk.Menu(menubar,tearoff=0)
filemenu.add_command(label="Open", command = fOpen)
filemenu.add_command(label="Save", command = fSave)
filemenu.add_command(label="Exit", command = ExitF)
menubar.add_cascade(label="File", menu=filemenu)
form.config(menu=menubar)
#Listbox with attached scrollbar
scrollbar=tk.Scrollbar(form)
mylist = tk.Listbox(form, yscrollcommand = scrollbar.set )
for line in range(100):
   mylist.insert("end", "This is line number " + str(line))
mylist.grid(row=7,column=1,rowspan=3, sticky='e', padx=25, pady=25)
scrollbar.config( command = mylist.yview )
scrollbar.grid(row=7, column=2, rowspan=3, sticky='nsw', padx=25, pady=25)
form.mainloop()
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

As Run gym-gazebo on Google Colaboratory says, you need to run a framebuffer server (that will emulate a graphical screen) and create a DISPLAY envvar pointing to it.

!apt-get install -y xvfb # Install X Virtual Frame Buffer
import os
os.system('Xvfb :1 -screen 0 1600x1200x16  &')    # create virtual display with size 1600x1200 and 16 bit color. Color can be changed to 24 or 8
os.environ['DISPLAY']=':1.0'    # tell X clients to use our virtual DISPLAY :1.0

However, if you want to interact with the GUI, that's going to be hard, 'cuz Colab doesn't support interactive screens out of the box.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...