Форум программистов, компьютерный форум, киберфорум
Наши страницы
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
 
Guitarist
0 / 0 / 0
Регистрация: 19.05.2018
Сообщений: 39
1

Архитектура приложения. Как правильнее сделать в моем случае?

16.12.2018, 09:25. Просмотров 426. Ответов 2

Доброе утро.
Исходные данные моей задачи:
Есть форма, содержащая 5 страниц (с абсолютно разным дизайном и полями), в которые пользователь вводит свои данные. После чего они сохраняются в CSV файл.
Я начал с программирования логики GUI.
Нашел в хелпах и в книгах типичные решения, которые подходили для моей задачи.
Вопрос по архитектуре. Как мне правильнее сделать валидацию полей ввода на каждой странице?
Где правильнее размещать этот код? Внутри класса или внутри main?
Вот, собственно, как получилось реализовать скелет программы.

Пользователь вводит исходные данные на странице 1.
Они проходят проверку на корректность (пока нужные данные не введены кнопка неактивна)
По нажатию на кнопку "Далее", пока в качестве заглушки, идет вывод в консоль. Планируется: сделать общий get из полей ввода
Родительское окно кнопки делается невидимым, вызывается окно 2. И логика повторяется вплоть до 5-го окна. В котором вместо "Далее" идет сохранение всех введенной информации и завершение работы программы.

Код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
from tkinter import*
import tkinter.messagebox
from tkinter import ttk
import random
import time
import datetime
 
 
 
palegreen0000='#%02x%02x%02x' % (227, 236, 235)
palegreen000='#%02x%02x%02x' % (235, 244, 242)
palegreen00='#%02x%02x%02x' % (217, 234, 229)
palegreen0='#%02x%02x%02x' % (203, 224, 217)
footergreen='#%02x%02x%02x' % (73, 154, 134)
bgnumbcolour='#%02x%02x%02x' % (0, 110, 81)
 
 
 
def main():
    root=Tk()
    app=Window1(root)
 
class Window1:
    def __init__(self, master):
        self.master=master
        self.master.resizable(0, 0)
        self.master.title('Ввод исходных данных Шаг 1/5')
        self.master.geometry('700x920+0+0')
        self.master.config(bg='green')
        self.frame=Frame(self.master, bg='blue')
        self.frame.pack()
        self.NextBtn=Button(self.frame, text='NEXT>>', width=100,
                            command=self.next_window)
        self.NextBtn.pack(side='bottom')
        
 
        
 
    def next_window(self):
        print('Data from page 1 collected!')
        self.master.withdraw()
        self.newWindow=Toplevel(self.master)
        self.app=Window2(self.newWindow)
        
            
class Window2:
    def __init__(self, master):
        self.master=master
        self.master.title('Ввод исходных данных Шаг 2/5')
        self.master.geometry('700x920+0+0')
        self.master.config(bg='white')
        self.frame=Frame(self. master, bg='blue')
        self.frame.pack()
        self.NextBtn=Button(self.frame, text='NEXT>>', width=100,
                            command=self.next_window)
        self.NextBtn.pack(side='right')
        self.PrevBtn=Button(self.frame, text='<<PREVIOUS', width=100,
                            command=self.prev_window)
        self.PrevBtn.pack(side='left')
        
    def next_window(self):
        print('Data from page 2 collected!')
        self.master.withdraw()
        self.newWindow=Toplevel(self.master)
        self.app=Window3(self.newWindow)
    def prev_window(self):
        self.master.withdraw()
        self.newWindow=Toplevel(self.master)
        self.app=Window1(self.newWindow)
 
class Window3:
    def __init__(self, master):
        self.master=master
        self.master.title('Ввод исходных данных Шаг 3/5')
        self.master.geometry('700x920+0+0')
        self.master.config(bg='white')
        self.frame=Frame(self. master, bg='blue')
        self.frame.pack()
        self.NextBtn=Button(self.frame, text='NEXT>>', width=100,
                            command=self.next_window)
        self.NextBtn.pack(side='right')
        self.PrevBtn=Button(self.frame, text='<<PREVIOUS', width=100,
                            command=self.prev_window)
        self.PrevBtn.pack(side='left')
        
    def next_window(self):
        print('Data from page 3 collected!')
        self.master.withdraw()
        self.newWindow=Toplevel(self.master)
        self.app=Window4(self.newWindow)
    def prev_window(self):
        self.master.withdraw()
        self.newWindow=Toplevel(self.master)
        self.app=Window2(self.newWindow)
 
class Window4:
    def __init__(self, master):
        self.master=master
        self.master.title('Ввод исходных данных Шаг 4/5')
        self.master.geometry('700x920+0+0')
        self.master.config(bg='white')
        self.frame=Frame(self. master, bg='blue')
        self.frame.pack()
        self.NextBtn=Button(self.frame, text='NEXT>>', width=100,
                            command=self.next_window)
        self.NextBtn.pack(side='right')
        self.PrevBtn=Button(self.frame, text='<<PREVIOUS', width=100,
                            command=self.prev_window)
        self.PrevBtn.pack(side='left')
        
    def next_window(self):
        print('Data from page 4 collected!')
        self.master.withdraw()
        self.newWindow=Toplevel(self.master)
        self.app=Window5(self.newWindow)
    def prev_window(self):
        self.master.withdraw()
        self.newWindow=Toplevel(self.master)
        self.app=Window3(self.newWindow)
 
class Window5:
    def __init__(self, master):
        self.master=master
        self.master.title('Ввод исходных данных Шаг 5/5')
        self.master.geometry('700x920+0+0')
        self.master.config(bg='white')
        self.frame=Frame(self. master, bg='blue')
        self.frame.pack()
        self.SaveBtn=Button(self.frame, text='SAVE', width=100,
                            command=self.save_data)
        self.SaveBtn.pack(side='right')
        self.PrevBtn=Button(self.frame, text='<<PREVIOUS', width=100,
                            command=self.prev_window)
        self.PrevBtn.pack(side='left')
        
    def save_data(self):
        print('Data from page 5 collected!')
        print('writing CSV file...')
        
    def prev_window(self):
        self.master.withdraw()
        self.newWindow=Toplevel(self.master)
        self.app=Window4(self.newWindow)
        
 
        
if __name__=='__main__':
    main()
Подскажите можно ли использовать такой подход для создания приложения?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.12.2018, 09:25
Ответы с готовыми решениями:

ООП. Как правильнее сделать?
Только начал изучать этот ЯП. До этого с ООП не сталкивался, только процедурный подход. В python...

Как сделать unregisterReceiver в моем случае?
вот так я регистрирую ресивер для отправки SMS: getActivity().registerReceiver(new...

Как сделать вывод популярных новостей, в моем случае ?
Здравствуйте подскажите пожалуйста, что нужно подправить в этом коде, чтоб картинка популярных...

Как же всё-таки сделать копию Liss<T>, где Т - ссылочный тип (в моем случае -- класс)
class T { int d; DateTime f; public T(int d, DateTIme date = new DateTime()) { d = d; f =...

Как создать отчет в моем случае?
Здравствуйте, объясните, пожалуйста, как мне создать отчет. У меня есть грид в форме, в нем...

2
vic5710
340 / 240 / 125
Регистрация: 10.12.2016
Сообщений: 765
16.12.2018, 10:52 2
Цитата Сообщение от Guitarist Посмотреть сообщение
Как мне правильнее сделать валидацию полей ввода на каждой странице?
по принципу инкапсуляции - у каждой формы своя валидация.
Цитата Сообщение от Guitarist Посмотреть сообщение
Подскажите можно ли использовать такой подход для создания приложения?
можно, тока зря ты в Tk делаешь - давно уже устарел. для продакшена лучше Wx, Qt, Kivy или веб-морда
для начала
https://codernet.ru/books/python/pyt...a_prilozhenij/
0
Guitarist
0 / 0 / 0
Регистрация: 19.05.2018
Сообщений: 39
16.12.2018, 11:04  [ТС] 3
Я поторопился со способом показа предыдущего окна. Переделываю через deiconify()
0
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2018, 11:04

Как обратиться к объекту в моем случае
Знатоки, будьте добры подскажите, как правильно обратиться к объектам и их данным? $result =...

Как обращаться к элементам массива в моем случае?
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; extern int asmproc(int matrix, int dimension); main() { ...

Как правильно заполнить запись в моем случае?
Здравствуйте, подскажите, пожалуйста, как правильно заполнить запись в таком случае: моя бд...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.