#coding=utf-8 import socket import tkinter as tk from tkinter import ttk import tkMessageBox as tkmb from ...db import PlayoffDB from ..frames import RepeatableEntry, WidgetRepeater from ..frames import ScrollableFrame, getIntVal class MySQLConfigurationFrame(tk.Frame): def __init__(self, *args, **kwargs): tk.Frame.__init__(self, *args, **kwargs) self.renderContent(self) def getConfig(self): if len(self.host.get().strip()): return { 'host': self.host.get().strip(), 'port': getIntVal(self.port, default=3306), 'user': self.user.get().strip(), 'pass': self.pass_.get().strip() } return None def _testDB(self): try: dbConfig = self.getConfig() if dbConfig is None: raise AttributeError('Database not configured') db = PlayoffDB(dbConfig) self.dbError = None self.dbTestLabel.configure(text='✓') self.dbTestLabel.configure(foreground='green') except Exception as e: self.dbError = unicode(e) self.dbTestLabel.configure(text='✗') self.dbTestLabel.configure(foreground='red') def _dbError(self, event): if self.dbError is not None: tkmb.showerror('Błąd połączenia z bazą danych', self.dbError) def _changeNotify(self, *args): self.winfo_toplevel().event_generate( '<>', when='tail') def renderContent(self, container): (ttk.Label(container, text='Ustawienia MySQL')).grid( row=0, column=0, columnspan=4, sticky=tk.E+tk.W) (ttk.Label(container, text='Host:')).grid( row=1, column=0, sticky=tk.E) self.host = tk.StringVar() self.host.trace('w', self._changeNotify) (ttk.Entry(container, textvariable=self.host)).grid( row=1, column=1, sticky=tk.E+tk.W) (ttk.Label(container, text='Port:')).grid( row=1, column=2, sticky=tk.E) self.port = tk.StringVar() self.port.set(3306) self.port.trace('w', self._changeNotify) (tk.Spinbox( container, textvariable=self.port, width=5, from_=0, to=65535)).grid(row=1, column=3, sticky=tk.W) (ttk.Label(container, text='Użytkownik:')).grid( row=2, column=0, sticky=tk.E) self.user = tk.StringVar() self.user.trace('w', self._changeNotify) (ttk.Entry(container, textvariable=self.user)).grid( row=2, column=1, sticky=tk.E+tk.W) (ttk.Button( container, text='Testuj ustawienia', command=self._testDB)).grid( row=2, column=3) self.dbError = None self.dbTestLabel = ttk.Label(container) self.dbTestLabel.grid(row=2, column=4) self.dbTestLabel.bind('', self._dbError) (ttk.Label(container, text='Hasło:')).grid( row=3, column=0, sticky=tk.E) self.pass_ = tk.StringVar() self.pass_.trace('w', self._changeNotify) (ttk.Entry(container, textvariable=self.pass_, show='*')).grid( row=3, column=1, sticky=tk.E+tk.W) class GoniecConfigurationFrame(tk.Frame): def __init__(self, *args, **kwargs): tk.Frame.__init__(self, *args, **kwargs) self.renderContent(self) def _enableWidgets(self): for field in [self.portField, self.hostField, self.testButton]: field.configure( state=tk.NORMAL if self.enable.get() else tk.DISABLED) def _test(self): try: goniec = socket.socket() goniec.connect( (self.host.get().strip(), getIntVal(self.port, 8080))) goniec.close() self.testError = None self.testLabel.configure(text='✓') self.testLabel.configure(foreground='green') except socket.error as e: self.testError = unicode(str(e).decode('utf-8', errors='replace')) self.testLabel.configure(text='✗') self.testLabel.configure(foreground='red') def _testError(self, event): if self.testError is not None: tkmb.showerror('Błąd połączenia z Gońcem', self.testError) def renderContent(self, container): (ttk.Label(container, text='Konfiguracja Gońca:')).grid( row=0, column=0, columnspan=4, sticky=tk.W) self.enable = tk.IntVar() (ttk.Checkbutton( container, text='Włącz obsługę Gońca', variable=self.enable, command=self._enableWidgets)).grid( row=1, column=0, columnspan=2, sticky=tk.W) (ttk.Label(container, text='Host:')).grid(row=2, column=0) self.host = tk.StringVar() self.hostField = ttk.Entry(container, textvariable=self.host) self.hostField.grid(row=2, column=1) (ttk.Label(container, text='Port:')).grid(row=2, column=2) self.port = tk.StringVar() self.port.set(8080) self.portField = tk.Spinbox( container, textvariable=self.port, width=5) self.portField.grid(row=2, column=3) self.testButton = ttk.Button( container, text='Testuj ustawienia', command=self._test) self.testButton.grid(row=3, column=1, sticky=tk.E) self.testError = None self.testLabel = ttk.Label(container) self.testLabel.grid(row=3, column=2, sticky=tk.W) self.testLabel.bind('', self._testError) self._enableWidgets() class RemoteConfigurationFrame(ScrollableFrame): def renderContent(self, container): (ttk.Label(container, text='Zdalne pliki konfiguracyjne:')).pack( side=tk.TOP, fill=tk.BOTH, expand=True) self.repeater = WidgetRepeater( container, RepeatableEntry, classParams={'width':100}) self.repeater.pack(side=tk.TOP, fill=tk.BOTH, expand=True) __all__ = ['MySQLConfigurationFrame', 'GoniecConfigurationFrame', 'RemoteConfigurationFrame']