From 353b6d158c5e34064728514a015ea760ee771268 Mon Sep 17 00:00:00 2001 From: emkael Date: Sat, 1 Jun 2019 01:14:30 +0200 Subject: Scrollable frames for team settings --- jfr_playoff/gui/__init__.py | 1 + jfr_playoff/gui/frames/__init__.py | 33 ++++++++++++++++ jfr_playoff/gui/frames/team.py | 77 ++++++++++++++++++-------------------- jfr_playoff/gui/tabs.py | 26 ++++++------- 4 files changed, 81 insertions(+), 56 deletions(-) (limited to 'jfr_playoff/gui') diff --git a/jfr_playoff/gui/__init__.py b/jfr_playoff/gui/__init__.py index 5737ab6..b654456 100644 --- a/jfr_playoff/gui/__init__.py +++ b/jfr_playoff/gui/__init__.py @@ -6,6 +6,7 @@ from .tabs import * class PlayoffGUI(tk.Tk): def __init__(self): tk.Tk.__init__(self) + self.geometry('920x640') self.tabs = {} def run(self): diff --git a/jfr_playoff/gui/frames/__init__.py b/jfr_playoff/gui/frames/__init__.py index f75a024..bc6bdb9 100644 --- a/jfr_playoff/gui/frames/__init__.py +++ b/jfr_playoff/gui/frames/__init__.py @@ -94,3 +94,36 @@ class RepeatableEntry(RepeatableFrame): def setValue(self, value): return self.value.set(value) + +class ScrollableFrame(tk.Frame): + def __init__(self, *args, **kwargs): + vertical = False + if 'vertical' in kwargs: + vertical = kwargs['vertical'] + del kwargs['vertical'] + horizontal = False + if 'horizontal' in kwargs: + horizontal = kwargs['horizontal'] + del kwargs['horizontal'] + tk.Frame.__init__(self, *args, **kwargs) + canvas = tk.Canvas(self, borderwidth=0, highlightthickness=0) + if horizontal: + hscroll = tk.Scrollbar( + self, orient=tk.HORIZONTAL, command=canvas.xview) + hscroll.pack(side=tk.BOTTOM, fill=tk.X) + canvas.configure(xscrollcommand=hscroll.set) + if vertical: + vscroll = tk.Scrollbar( + self, orient=tk.VERTICAL, command=canvas.yview) + vscroll.pack(side=tk.RIGHT, fill=tk.Y) + canvas.configure(yscrollcommand=vscroll.set) + frame = tk.Frame(canvas, borderwidth=0, highlightthickness=0) + canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) + canvas.create_window((0,0), window=frame, anchor=tk.N+tk.W) + frame.bind( + '', + lambda ev: canvas.configure(scrollregion=canvas.bbox('all'))) + self.renderContent(frame) + + def renderContent(self, container): + pass diff --git a/jfr_playoff/gui/frames/team.py b/jfr_playoff/gui/frames/team.py index a3ab3d8..e041510 100644 --- a/jfr_playoff/gui/frames/team.py +++ b/jfr_playoff/gui/frames/team.py @@ -5,7 +5,8 @@ from tkinter.font import Font from tkinter import ttk import tkMessageBox -from ..frames import RepeatableFrame, WidgetRepeater, RepeatableEntry, getIntVal +from ..frames import RepeatableFrame, WidgetRepeater, RepeatableEntry +from ..frames import getIntVal, ScrollableFrame class ManualTeamRow(RepeatableFrame): def renderContent(self): @@ -177,14 +178,10 @@ class TeamFetchSettingsFrame(tk.Frame): self.finishingPositionsBtn.grid(row=3, column=3, sticky=tk.W) self._setFinishingPositions([]) -class TeamSettingsFrame(tk.Frame): +class TeamSettingsFrame(ScrollableFrame): FORMAT_FETCH = 0 FORMAT_MANUAL = 1 - def __init__(self, *args, **kwargs): - tk.Frame.__init__(self, *args, **kwargs) - self.renderContent() - def _setPanelState(self, frame, state): for child in frame.winfo_children(): if isinstance(child, tk.Frame): @@ -208,29 +205,29 @@ class TeamSettingsFrame(tk.Frame): def setTeams(self, event): self.teams = self.winfo_toplevel().getTeams() - def renderContent(self): + def renderContent(self, container): self.teamFormat = tk.IntVar() self.teamFormat.trace('w', self._enablePanels) self.teamFormat.trace('w', self._changeNotify) (ttk.Radiobutton( - self, text='Pobierz z JFR Teamy:', + container, text='Pobierz z JFR Teamy:', variable=self.teamFormat, value=self.FORMAT_FETCH)).grid( row=0, column=0, sticky=tk.W) - self.fetchSettingsFrame = TeamFetchSettingsFrame(self) + self.fetchSettingsFrame = TeamFetchSettingsFrame(container) self.fetchSettingsFrame.grid(row=1, column=0, sticky=tk.W+tk.E) (ttk.Separator( - self, orient=tk.HORIZONTAL)).grid( + container, orient=tk.HORIZONTAL)).grid( row=2, column=0, sticky=tk.W+tk.E) (ttk.Radiobutton( - self, text='Ustaw ręcznie:', + container, text='Ustaw ręcznie:', variable=self.teamFormat, value=self.FORMAT_MANUAL)).grid( row=3, column=0, sticky=tk.W+tk.E) - self.manualSettingsFrame = TeamManualSettingsFrame(self) + self.manualSettingsFrame = TeamManualSettingsFrame(container) self.manualSettingsFrame.grid(row=4, column=0, sticky=tk.W+tk.E) self.teamFormat.set(self.FORMAT_MANUAL) @@ -275,32 +272,27 @@ class TeamAliasRow(RepeatableFrame): if oldName in options: self.teamName.set(oldName) -class TeamAliasFrame(tk.Frame): - def __init__(self, *args, **kwags): - tk.Frame.__init__(self, *args, **kwags) - self.renderContent() - - def renderContent(self): - self.columnconfigure(0, weight=1) - (ttk.Label(self, text='Aliasy teamów')).grid( +class TeamAliasFrame(ScrollableFrame): + def renderContent(self, container): + container.columnconfigure(0, weight=1) + (ttk.Label(container, text='Aliasy teamów')).grid( row=0, column=0, sticky=tk.W+tk.E) - self.repeater = WidgetRepeater(self, TeamAliasRow) + self.repeater = WidgetRepeater(container, TeamAliasRow) self.repeater.grid(row=1, column=0, sticky=tk.W+tk.E) def getConfig(self): return {val[0]: val[1] for val in self.repeater.getValue() if val[0]} -class TeamPreviewFrame(tk.Frame): +class TeamPreviewFrame(ScrollableFrame): def __init__(self, *args, **kwags): - tk.Frame.__init__(self, *args, **kwags) self.tieValues = [] self.tieFields = [] self.labels = [] - self.renderContent() + ScrollableFrame.__init__(self, *args, **kwags) self.winfo_toplevel().bind( '<>', self.refreshTeams, add='+') - def setTeams(self, teams): + def setTeams(self, container, teams): self.teamList.grid( row=1, column=0, rowspan=len(teams)+2, sticky=tk.W+tk.E+tk.N+tk.S) self.tieValues = self.tieValues[0:len(teams)] @@ -316,34 +308,35 @@ class TeamPreviewFrame(tk.Frame): self.tieValues.append(tk.StringVar()) self.tieFields.append( tk.Spinbox( - self, from_=0, to=9999, width=5, font=Font(size=10), + container, from_=0, to=9999, + width=5, font=Font(size=10), textvariable=self.tieValues[idx])) self.tieFields[idx].grid( row=idx+2, column=1, sticky=tk.W+tk.E+tk.N) - self.rowconfigure(idx+2, weight=0) - self.labels.append(ttk.Label(self, text=' ')) + container.rowconfigure(idx+2, weight=0) + self.labels.append(ttk.Label(container, text=' ')) self.labels[-1].grid(row=1, column=1, pady=3) - self.labels.append(ttk.Label(self, text=' ')) + self.labels.append(ttk.Label(container, text=' ')) self.labels[-1].grid(row=len(teams)+2, column=1) - self.rowconfigure(1, weight=0) - self.rowconfigure(len(teams)+2, weight=1) + container.rowconfigure(1, weight=0) + container.rowconfigure(len(teams)+2, weight=1) self.labels.append(ttk.Label( - self, + container, text='Kolejność rozstrzygania remisów w klasyfikacji ' + \ 'pobranej z bazy JFR Teamy', anchor=tk.E)) - self.labels[-1].grid(row=len(teams)+3, column=0, sticky=tk.E) - self.labels.append(ttk.Label(self, text='⬏', font=Font(size=20))) + self.labels[-1].grid(row=len(teams)+3, column=0, sticky=tk.N+tk.E) + self.labels.append(ttk.Label(container, text='⬏', font=Font(size=20))) self.labels[-1].grid( row=len(teams)+3, column=1, sticky=tk.W+tk.N) - self.rowconfigure(len(teams)+3, weight=1) + container.rowconfigure(len(teams)+3, weight=1) - def renderContent(self): - self.columnconfigure(0, weight=1) - (ttk.Label(self, text='Podgląd listy teamów')).grid( + def renderContent(self, container): + container.columnconfigure(0, weight=1) + (ttk.Label(container, text='Podgląd listy teamów')).grid( row=0, column=0, columnspan=2, sticky=tk.W+tk.E) self.teamList = ttk.Treeview( - self, show='headings', + container, show='headings', columns=['fullname','shortname','icon','position'], selectmode='browse') for col, heading in enumerate( @@ -353,7 +346,9 @@ class TeamPreviewFrame(tk.Frame): if heading[1]: self.teamList.column(col, width=heading[1], stretch=True) - self.setTeams([]) + self.container = container + + self.setTeams(self.container, []) def getTieConfig(self): ties = [getIntVal(val, 0) for val in self.tieValues] @@ -362,6 +357,6 @@ class TeamPreviewFrame(tk.Frame): return ties def refreshTeams(self, event): - self.setTeams(self.winfo_toplevel().getTeams()) + self.setTeams(self.container, self.winfo_toplevel().getTeams()) __all__ = ['TeamSettingsFrame', 'TeamAliasFrame', 'TeamPreviewFrame'] diff --git a/jfr_playoff/gui/tabs.py b/jfr_playoff/gui/tabs.py index c81a14a..e64c768 100644 --- a/jfr_playoff/gui/tabs.py +++ b/jfr_playoff/gui/tabs.py @@ -99,22 +99,18 @@ class TeamsTab(PlayoffTab): return 'Uczestnicy' def renderContent(self, container): - self.settingsFrame = TeamSettingsFrame(container, padx=5, pady=5) - self.settingsFrame.grid(row=0, column=0, sticky=tk.N+tk.E+tk.S+tk.W) - self.settingsFrame.columnconfigure(2, weight=1) - self.previewFrame = TeamPreviewFrame(container) - self.previewFrame.grid(row=0, column=1, rowspan=2, - sticky=tk.N+tk.E+tk.W) + leftFrame = tk.Frame(container) + leftFrame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) + self.settingsFrame = TeamSettingsFrame( + leftFrame, vertical=True, padx=5, pady=5) + self.settingsFrame.pack(side=tk.TOP, fill=tk.BOTH, expand=True) (ttk.Separator( - container, orient=tk.HORIZONTAL)).grid( - row=1, column=0, sticky=tk.W+tk.E) - self.aliasFrame = TeamAliasFrame(container) - self.aliasFrame.grid(row=2, column=0, - sticky=tk.N+tk.E+tk.S+tk.W) - container.columnconfigure(0, weight=1) - container.columnconfigure(1, weight=3) - container.rowconfigure(0, weight=2) - container.rowconfigure(2, weight=1) + leftFrame, orient=tk.HORIZONTAL)).pack( + side=tk.TOP, fill=tk.X) + self.aliasFrame = TeamAliasFrame(leftFrame, vertical=True) + self.aliasFrame.pack(side=tk.TOP, fill=tk.BOTH, expand=True) + self.previewFrame = TeamPreviewFrame(container, vertical=True) + self.previewFrame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True) self._teamList = [] self._teamListFetcher = None -- cgit v1.2.3