Merge pull request #1601 from leonelcamara/port_dialog

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