authorize
. Либо объявите для окна класс, сделайте все функции его методами, а вместо переменных используйте поля, либо передавайте переменные в функцию.button_login = Button(text = 'Войти!', command = lambda : save(login, password))
def save(login, password):
root.mainloop()
Его нельзя останавливать, иначе приложение зависнет. А блокирующий вызов x.join()
как раз это и делает.from functools import partial
import threading
import time
import tkinter as tk
from tkinter.ttk import Progressbar
import queue
def worker(q, r):
for i in range(100):
# Передаём в очередь текущее значение
q.put(i + 1)
# Генерируем событие
r.event_generate('<<Updated>>', when='tail')
# Спим для наглядности
time.sleep(0.1)
def on_update(event, q=None, pb=None):
# Получаем данные из очереди
pb['value'] = q.get()
# Создаём очередь для обмена данными между поткоами
q = queue.Queue()
# Создаём окно
root = tk.Tk()
progressbar = Progressbar(root, orient=tk.HORIZONTAL, length=100, mode='determinate')
progressbar.pack()
# "Передаём" в обработчик ссылки на очередь и progressbar
handler = partial(on_update, q=q, pb=progressbar)
# Регистрируем обработчик для события обновления progressbar'а
root.bind('<<Updated>>', handler)
# Создаём поток и передаём в него ссылки на очередь и окно
t = threading.Thread(target=worker, args=(q, root))
t.start()
root.mainloop()
[
[ # Первый зал
True, # Первое место (занято)
False, # Второе место (не занято)
False,
True,
...
],
[ ... ], # Второй зал
]
del some_dict['some_key']
def insert_text(event):
file_name = fd.askopenfilename()
if file_name:
with open(file_name) as f:
s = f.read()
text.insert(1.0, s)
def extract_text(event):
file_name = fd.asksaveasfilename(filetypes=(('mmm files', '*.mmm',),))
if file_name:
with open(file_name, 'w') as f:
s = text.get(1.0, tk.END)
f.write(s)
if __name__ == '__main__':
root = tk.Tk()
root.title('test')
root.state('zoomed')
root.bind('<Control-o>', insert_text)
root.bind('<Control-s>', extract_text)
text = tk.Text(width=50, height=25)
text.grid(columnspan=2)
root.mainloop()
import tkinter as tk
class WizardLikeApp(tk.Tk):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
container = tk.Frame(self)
container.pack(side='top', fill='both', expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (StartPage, PageOne, PageTwo):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky='nsew')
self.show_frame(StartPage)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
class StartPage(tk.Frame):
def __init__(self, parent, controller):
super().__init__(parent)
label = tk.Label(self, text='Start Page')
label.pack(pady=10, padx=10)
button = tk.Button(self, text='Visit Page 1',
command=lambda: controller.show_frame(PageOne))
button.pack()
button2 = tk.Button(self, text='Visit Page 2',
command=lambda: controller.show_frame(PageTwo))
button2.pack()
class PageOne(tk.Frame):
def __init__(self, parent, controller):
super().__init__(parent)
label = tk.Label(self, text='Page One')
label.pack(pady=10, padx=10)
button1 = tk.Button(self, text='Back to Home',
command=lambda: controller.show_frame(StartPage))
button1.pack()
button2 = tk.Button(self, text='Page Two',
command=lambda: controller.show_frame(PageTwo))
button2.pack()
class PageTwo(tk.Frame):
def __init__(self, parent, controller):
super().__init__(parent)
label = tk.Label(self, text='Page Two')
label.pack(pady=10, padx=10)
button1 = tk.Button(self, text='Back to Home',
command=lambda: controller.show_frame(StartPage))
button1.pack()
button2 = tk.Button(self, text='Page One',
command=lambda: controller.show_frame(PageOne))
button2.pack()
app = WizardLikeApp()
app.mainloop()
import tkinter as tk
from threading import Thread
from http.server import HTTPServer, CGIHTTPRequestHandler
httpserver_address = ("", 80)
httpserver = HTTPServer(httpserver_address, CGIHTTPRequestHandler)
srv_thread = Thread(target=httpserver.serve_forever)
root = tk.Tk()
root.title('Server')
root.minsize(width = 20, height = 50)
root.maxsize(width = 20, height = 50)
buttonStart = tk.Button(root, text = "Start", width = 5, height = 1, bg = "#099a0f")
buttonStart.bind("<Button-1>", lambda event: srv_thread.start())
buttonStart.grid(row = 2, column = 0, columnspan = 1)
root.mainloop()
import tkinter as tk
root = tk.Tk()
root.title("Main Window")
root.geometry("640x480")
sub = tk.Toplevel(root)
sub.transient(root)
sub.title('Sub Window')
sub.minsize(320, 240)
sub.maxsize(320, 240)
pos = []
def main_move(event):
if pos:
sub.geometry("+{0}+{1}".format(pos[0], pos[1]))
def sub_move(event):
min_w = root.winfo_rootx()
min_h = root.winfo_rooty()
max_w = root.winfo_rootx() + root.winfo_width() - 15
max_h = root.winfo_rooty() + root.winfo_height() - 35
if event.x < min_w:
sub.geometry("+{0}+{1}".format(min_w, event.y))
elif event.y < min_h:
sub.geometry("+{0}+{1}".format(event.x, min_h))
elif event.x + event.width > max_w:
sub.geometry("+{0}+{1}".format(max_w - event.width, event.y))
elif event.y + event.height > max_h:
sub.geometry("+{0}+{1}".format(event.x, max_h - event.height))
global pos
pos = [event.x, event.y]
root.bind('<Configure>', main_move)
sub.bind('<Configure>', sub_move)
root.mainloop()