diff --git a/gluon/widget.py b/gluon/widget.py index 131bfc3f..0804fa96 100644 --- a/gluon/widget.py +++ b/gluon/widget.py @@ -13,7 +13,7 @@ from __future__ import print_function import datetime import sys -from gluon._compat import StringIO, thread, xrange +from gluon._compat import StringIO, thread, xrange, PY2 import time import threading import os @@ -134,24 +134,29 @@ class web2pyDialog(object): def __init__(self, root, options): """ web2pyDialog constructor """ - import Tkinter - import tkMessageBox + if PY2: + import Tkinter as tkinter + import tkMessageBox as messagebox + else: + import tkinter + from tkinter import messagebox + bg_color = 'white' root.withdraw() - self.root = Tkinter.Toplevel(root, bg=bg_color) + self.root = tkinter.Toplevel(root, bg=bg_color) self.root.resizable(0, 0) self.root.title(ProgramName) self.options = options self.scheduler_processes = {} - self.menu = Tkinter.Menu(self.root) - servermenu = Tkinter.Menu(self.menu, tearoff=0) + self.menu = tkinter.Menu(self.root) + servermenu = tkinter.Menu(self.menu, tearoff=0) httplog = os.path.join(self.options.folder, self.options.log_filename) iconphoto = os.path.join('extras', 'icons', 'web2py.gif') if os.path.exists(iconphoto): - img = Tkinter.PhotoImage(file=iconphoto) + img = tkinter.PhotoImage(file=iconphoto) self.root.tk.call('wm', 'iconphoto', self.root._w, img) # Building the Menu item = lambda: start_browser(httplog) @@ -163,16 +168,16 @@ class web2pyDialog(object): self.menu.add_cascade(label='Server', menu=servermenu) - self.pagesmenu = Tkinter.Menu(self.menu, tearoff=0) + self.pagesmenu = tkinter.Menu(self.menu, tearoff=0) self.menu.add_cascade(label='Pages', menu=self.pagesmenu) #scheduler menu - self.schedmenu = Tkinter.Menu(self.menu, tearoff=0) + self.schedmenu = tkinter.Menu(self.menu, tearoff=0) self.menu.add_cascade(label='Scheduler', menu=self.schedmenu) #start and register schedulers from options self.update_schedulers(start=True) - helpmenu = Tkinter.Menu(self.menu, tearoff=0) + helpmenu = tkinter.Menu(self.menu, tearoff=0) # Home Page item = lambda: start_browser('http://www.web2py.com/') @@ -180,7 +185,7 @@ class web2pyDialog(object): command=item) # About - item = lambda: tkMessageBox.showinfo('About web2py', ProgramInfo) + item = lambda: messagebox.showinfo('About web2py', ProgramInfo) helpmenu.add_command(label='About', command=item) @@ -194,10 +199,10 @@ class web2pyDialog(object): else: self.root.protocol('WM_DELETE_WINDOW', self.quit) - sticky = Tkinter.NW + sticky = tkinter.NW # Prepare the logo area - self.logoarea = Tkinter.Canvas(self.root, + self.logoarea = tkinter.Canvas(self.root, background=bg_color, width=300, height=300) @@ -206,22 +211,22 @@ class web2pyDialog(object): logo = os.path.join('extras', 'icons', 'splashlogo.gif') if os.path.exists(logo): - img = Tkinter.PhotoImage(file=logo) - pnl = Tkinter.Label(self.logoarea, image=img, background=bg_color, bd=0) + img = tkinter.PhotoImage(file=logo) + pnl = tkinter.Label(self.logoarea, image=img, background=bg_color, bd=0) pnl.pack(side='top', fill='both', expand='yes') # Prevent garbage collection of img pnl.image = img # Prepare the banner area - self.bannerarea = Tkinter.Canvas(self.root, + self.bannerarea = tkinter.Canvas(self.root, bg=bg_color, width=300, height=300) self.bannerarea.grid(row=1, column=1, columnspan=2, sticky=sticky) - Tkinter.Label(self.bannerarea, anchor=Tkinter.N, + tkinter.Label(self.bannerarea, anchor=tkinter.N, text=str(ProgramVersion + "\n" + ProgramAuthor), - font=('Helvetica', 11), justify=Tkinter.CENTER, + font=('Helvetica', 11), justify=tkinter.CENTER, foreground='#195866', background=bg_color, height=3).pack(side='top', fill='both', @@ -230,24 +235,24 @@ class web2pyDialog(object): self.bannerarea.after(1000, self.update_canvas) # IP - Tkinter.Label(self.root, + tkinter.Label(self.root, text='Server IP:', bg=bg_color, - justify=Tkinter.RIGHT).grid(row=4, + justify=tkinter.RIGHT).grid(row=4, column=1, sticky=sticky) self.ips = {} - self.selected_ip = Tkinter.StringVar() + self.selected_ip = tkinter.StringVar() row = 4 ips = [('127.0.0.1', 'Local (IPv4)')] + \ ([('::1', 'Local (IPv6)')] if socket.has_ipv6 else []) + \ [(ip, 'Public') for ip in options.ips] + \ [('0.0.0.0', 'Public')] for ip, legend in ips: - self.ips[ip] = Tkinter.Radiobutton( + self.ips[ip] = tkinter.Radiobutton( self.root, bg=bg_color, highlightthickness=0, selectcolor='light grey', width=30, - anchor=Tkinter.W, text='%s (%s)' % (legend, ip), - justify=Tkinter.LEFT, + anchor=tkinter.W, text='%s (%s)' % (legend, ip), + justify=tkinter.LEFT, variable=self.selected_ip, value=ip) self.ips[ip].grid(row=row, column=2, sticky=sticky) if row == 4: @@ -256,30 +261,30 @@ class web2pyDialog(object): shift = row # Port - Tkinter.Label(self.root, + tkinter.Label(self.root, text='Server Port:', bg=bg_color, - justify=Tkinter.RIGHT).grid(row=shift, + justify=tkinter.RIGHT).grid(row=shift, column=1, pady=10, sticky=sticky) - self.port_number = Tkinter.Entry(self.root) - self.port_number.insert(Tkinter.END, self.options.port) + self.port_number = tkinter.Entry(self.root) + self.port_number.insert(tkinter.END, self.options.port) self.port_number.grid(row=shift, column=2, sticky=sticky, pady=10) # Password - Tkinter.Label(self.root, + tkinter.Label(self.root, text='Choose Password:', bg=bg_color, - justify=Tkinter.RIGHT).grid(row=shift + 1, + justify=tkinter.RIGHT).grid(row=shift + 1, column=1, sticky=sticky) - self.password = Tkinter.Entry(self.root, show='*') + self.password = tkinter.Entry(self.root, show='*') self.password.bind('', lambda e: self.start()) self.password.focus_force() self.password.grid(row=shift + 1, column=2, sticky=sticky) # Prepare the canvas - self.canvas = Tkinter.Canvas(self.root, + self.canvas = tkinter.Canvas(self.root, width=400, height=100, bg='black') @@ -288,19 +293,19 @@ class web2pyDialog(object): self.canvas.after(1000, self.update_canvas) # Prepare the frame - frame = Tkinter.Frame(self.root) + frame = tkinter.Frame(self.root) frame.grid(row=shift + 3, column=1, columnspan=2, pady=5, sticky=sticky) # Start button - self.button_start = Tkinter.Button(frame, + self.button_start = tkinter.Button(frame, text='start server', command=self.start) self.button_start.grid(row=0, column=0, sticky=sticky) # Stop button - self.button_stop = Tkinter.Button(frame, + self.button_stop = tkinter.Button(frame, text='stop server', command=self.stop) @@ -454,9 +459,12 @@ class web2pyDialog(object): def error(self, message): """ Shows error message """ - - import tkMessageBox - tkMessageBox.showerror('web2py start server', message) + if PY2: + import tkMessageBox as messagebox + else: + from tkinter import messagebox + + messagebox.showerror('web2py start server', message) def start(self): """ Starts web2py server """ @@ -1191,10 +1199,13 @@ def start(cron=True): if not options.nogui and options.password == '': try: - import Tkinter + if PY2: + import Tkinter as tkinter + else: + import tkinter havetk = True try: - root = Tkinter.Tk() + root = tkinter.Tk() except: pass except (ImportError, OSError):