openfree commited on
Commit
eb887b5
·
verified ·
1 Parent(s): 11554e6

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +260 -10
app.py CHANGED
@@ -1,16 +1,266 @@
1
-
2
  import gradio as gr
3
  import qrcode
4
  import random
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
 
6
- def texttoqr(Input):
7
- qr_img = qrcode.make(Input)
8
- count = random.randint(1, 99999999999999999999999999999999999999)
9
- if (count > 0):
10
- name = 'qrfile/'+"qr-img"+ str(count) +".jpg"
11
- qr_img.save(name)
12
- return name
13
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
 
15
- demo = gr.Interface(texttoqr, gr.Textbox(lines=1, placeholder="Enter Your Text Here..."), "image")
16
- demo.launch()
 
 
 
 
1
  import gradio as gr
2
  import qrcode
3
  import random
4
+ import os
5
+ from datetime import datetime
6
+ from PIL import Image
7
+
8
+ # QR 코드 생성을 위한 메인 함수
9
+ def create_qr(
10
+ content,
11
+ qr_type,
12
+ fill_color,
13
+ back_color,
14
+ box_size,
15
+ border_size,
16
+ error_correction
17
+ ):
18
+ # QR 코드 데이터 포맷팅
19
+ formatted_data = format_data(content, qr_type)
20
+
21
+ # 에러 수정 레벨 설정
22
+ error_levels = {
23
+ "Low (7%)": qrcode.constants.ERROR_CORRECT_L,
24
+ "Medium (15%)": qrcode.constants.ERROR_CORRECT_M,
25
+ "Quartile (25%)": qrcode.constants.ERROR_CORRECT_Q,
26
+ "High (30%)": qrcode.constants.ERROR_CORRECT_H
27
+ }
28
+
29
+ # QR 코드 생성
30
+ qr = qrcode.QRCode(
31
+ version=1,
32
+ error_correction=error_levels[error_correction],
33
+ box_size=box_size,
34
+ border=border_size,
35
+ )
36
+
37
+ qr.add_data(formatted_data)
38
+ qr.make(fit=True)
39
+
40
+ # QR 이미지 생성
41
+ qr_img = qr.make_image(fill_color=fill_color, back_color=back_color)
42
+
43
+ # 파일 저장
44
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
45
+ random_id = random.randint(1000, 9999)
46
+ filename = f"qrfile/qr_{timestamp}_{random_id}.png"
47
+
48
+ # 디렉토리 확인 및 생성
49
+ os.makedirs("qrfile", exist_ok=True)
50
+
51
+ # 이미지 저장
52
+ qr_img.save(filename)
53
+ cleanup_old_files("qrfile/", max_files=100)
54
+
55
+ return filename, formatted_data
56
+
57
+ # 데이터 포맷팅 함수
58
+ def format_data(content, qr_type):
59
+ if not content:
60
+ return ""
61
+
62
+ format_rules = {
63
+ "URL": lambda x: f"https://{x}" if not x.startswith(('http://', 'https://')) else x,
64
+ "Email": lambda x: f"mailto:{x}",
65
+ "Phone": lambda x: f"tel:{x}",
66
+ "SMS": lambda x: f"sms:{x}",
67
+ "WhatsApp": lambda x: f"whatsapp://send?text={x}",
68
+ "Location": lambda x: f"geo:{x}",
69
+ "Wi-Fi": lambda x: f"WIFI:S:{x};;",
70
+ "Text": lambda x: x,
71
+ "vCard": lambda x: f"BEGIN:VCARD\nVERSION:3.0\n{x}\nEND:VCARD"
72
+ }
73
+
74
+ return format_rules[qr_type](content.strip())
75
+
76
+ # 파일 정리 함수
77
+ def cleanup_old_files(directory, max_files):
78
+ files = [f for f in os.listdir(directory) if f.endswith('.png')]
79
+ if len(files) > max_files:
80
+ files.sort(key=lambda x: os.path.getctime(os.path.join(directory, x)))
81
+ for f in files[:-max_files]:
82
+ try:
83
+ os.remove(os.path.join(directory, f))
84
+ except:
85
+ continue
86
+
87
+ def get_example_placeholder(qr_type):
88
+ examples = {
89
+ "URL": "example.com or https://example.com",
90
+ "Email": "[email protected]",
91
+ "Phone": "+1234567890",
92
+ "SMS": "+1234567890",
93
+ "WhatsApp": "Hello World!",
94
+ "Location": "37.7749,-122.4194",
95
+ "Wi-Fi": "MyWiFiNetwork",
96
+ "Text": "Any text you want to encode",
97
+ "vCard": "FN:John Doe\nTEL:+1234567890\nEMAIL:[email protected]"
98
+ }
99
+ return examples.get(qr_type, "Enter your content here...")
100
+
101
+ def format_example_text(qr_type):
102
+ examples = {
103
+ "URL": "• Direct URL: https://example.com\n• Without https: example.com",
104
+ "Email": "• Basic: [email protected]\n• With subject: [email protected]?subject=Hello",
105
+ "Phone": "• International: +1234567890\n• Local: 01012345678",
106
+ "SMS": "• Basic: +1234567890\n• With message: +1234567890?body=Hello",
107
+ "WhatsApp": "• Message: Hello World!\n• With number: +1234567890:Hello",
108
+ "Location": "• Coordinates: 37.7749,-122.4194\n• With zoom: 37.7749,-122.4194,15z",
109
+ "Wi-Fi": "• Network name only: MyWiFiNetwork\n• With password: WIFI:S:MyNetwork;P:password;;",
110
+ "Text": "• Simple text: Hello World!\n• Multiple lines: Line 1\\nLine 2",
111
+ "vCard": "• Basic:\nFN:John Doe\nTEL:+1234567890\nEMAIL:[email protected]\n• Extended:\nFN:John Doe\nTEL:+1234567890\nEMAIL:[email protected]\nADR:;;123 Street;City;State;12345;Country"
112
+ }
113
+ return examples.get(qr_type, "Enter your content here...")
114
+
115
+ # Gradio 인터페이스 생성
116
+ def create_interface():
117
+ # 테마 설정
118
+ theme = gr.themes.Soft(
119
+ primary_hue="blue",
120
+ secondary_hue="indigo",
121
+ ).set(
122
+ body_background_fill="*neutral_50",
123
+ block_background_fill="*neutral_100",
124
+ button_primary_background_fill="*primary_500",
125
+ )
126
+
127
+ # 인터페이스 구성
128
+ with gr.Blocks(theme=theme, title="Advanced QR Code Generator") as demo:
129
+ gr.Markdown(
130
+ """
131
+ # 🎯 Advanced QR Code Generator
132
+ Create customized QR codes for various purposes with professional styling options.
133
+ """
134
+ )
135
+
136
+ with gr.Row():
137
+ with gr.Column(scale=2):
138
+ # 입력 섹션
139
+ qr_type = gr.Dropdown(
140
+ choices=[
141
+ "URL",
142
+ "Email",
143
+ "Phone",
144
+ "SMS",
145
+ "WhatsApp",
146
+ "Location",
147
+ "Wi-Fi",
148
+ "Text",
149
+ "vCard"
150
+ ],
151
+ value="URL",
152
+ label="QR Code Type"
153
+ )
154
+
155
+ content = gr.Textbox(
156
+ label="Content",
157
+ placeholder="Enter your content here...",
158
+ lines=3
159
+ )
160
+
161
+ example_format = gr.Markdown(
162
+ format_example_text("URL"),
163
+ label="Format Examples"
164
+ )
165
+
166
+ with gr.Row():
167
+ fill_color = gr.ColorPicker(
168
+ label="QR Code Color",
169
+ value="#000000"
170
+ )
171
+ back_color = gr.ColorPicker(
172
+ label="Background Color",
173
+ value="#FFFFFF"
174
+ )
175
+
176
+ with gr.Row():
177
+ box_size = gr.Slider(
178
+ minimum=1,
179
+ maximum=20,
180
+ value=10,
181
+ step=1,
182
+ label="QR Code Size"
183
+ )
184
+ border_size = gr.Slider(
185
+ minimum=0,
186
+ maximum=10,
187
+ value=4,
188
+ step=1,
189
+ label="Border Size"
190
+ )
191
+
192
+ error_correction = gr.Dropdown(
193
+ choices=[
194
+ "Low (7%)",
195
+ "Medium (15%)",
196
+ "Quartile (25%)",
197
+ "High (30%)"
198
+ ],
199
+ value="Medium (15%)",
200
+ label="Error Correction Level"
201
+ )
202
+
203
+ generate_btn = gr.Button(
204
+ "Generate QR Code",
205
+ variant="primary"
206
+ )
207
+
208
+ with gr.Column(scale=1):
209
+ # 출력 섹션
210
+ output_image = gr.Image(
211
+ label="Generated QR Code",
212
+ type="filepath"
213
+ )
214
+ output_data = gr.Textbox(
215
+ label="Formatted Data",
216
+ interactive=False
217
+ )
218
+
219
+ # QR 타입 변경 시 예제 텍스트 업데이트
220
+ def update_example(qr_type):
221
+ return gr.Markdown.update(value=format_example_text(qr_type))
222
 
223
+ qr_type.change(
224
+ fn=update_example,
225
+ inputs=[qr_type],
226
+ outputs=[example_format]
227
+ )
 
 
228
 
229
+ # 이벤트 핸들러
230
+ generate_btn.click(
231
+ fn=create_qr,
232
+ inputs=[
233
+ content,
234
+ qr_type,
235
+ fill_color,
236
+ back_color,
237
+ box_size,
238
+ border_size,
239
+ error_correction
240
+ ],
241
+ outputs=[output_image, output_data]
242
+ )
243
+
244
+ # 사용 안내
245
+ gr.Markdown(
246
+ """
247
+ ### 📝 Instructions
248
+ 1. Select the QR code type from the dropdown menu
249
+ 2. Enter your content following the format examples shown
250
+ 3. Customize the appearance using the color pickers and sliders
251
+ 4. Click 'Generate QR Code' to create your custom QR code
252
+
253
+ ### 💡 Tips
254
+ - Use higher error correction levels for better scan reliability
255
+ - Ensure sufficient contrast between QR code and background colors
256
+ - Keep the content concise for better readability
257
+ - Follow the format examples for best results
258
+ """
259
+ )
260
+
261
+ return demo
262
 
263
+ # 메인 실행
264
+ if __name__ == "__main__":
265
+ demo = create_interface()
266
+ demo.launch(share=True)