поэтому я сделал индикатор выполнения для своей страницы входа в свое приложение в customtkinter и хотел остановить индикатор выполнения на 100 или 1, в основном на максимуме
Я пробовал много методов, таких как использование цикла while и т. д., но когда приложение вылетало/зависало, я не знаю почему, и я не нашел какой-либо конкретной функции для этой цели. Я даже смотрел учебник, но он ни в одном не упоминается, Я был бы очень признателен за чью-либо помощь,
ПРИМЕЧАНИЕ. - МОЙ ШКАЛА ПРОГРЕССА НАХОДИТСЯ ВНУТРИ ФУНКЦИИ, КОТОРАЯ СОЗДАЕТ И ЗАПУСКАЕТ ШКАЛУ ПРОГРЕССА, КОГДА Я НАЖИМАЮ КНОПКУ ВХОД ПОСЛЕ ВВЕДЕНИЯ ИМЯ ПОЛЬЗОВАТЕЛЯ И ПАРОЛЯ.
Обновлено: Извините, мне следовало предоставить дополнительную информацию об этом сейчас, я не знаю, следует ли мне предоставлять весь код графического интерфейса или нет, поскольку он содержит около 150 строк, это не полный код, но именно в этом проблема, поэтому я просто хочу сделать этот индикатор выполнения останавливается на 100, 1 или максимуме, я также пытался поместить цикл while в функцию pbarl, которая будет продолжать проверять значение индикатора выполнения, но происходит сбой, мне не очень нужно решение сбоя, но основная проблема - остановка это на максимуме, Функция pbarl прикреплена к кнопке b3 или кнопке входа в систему, которая при нажатии вызывает ее, и эта функция создает индикатор выполнения, начало шага определяется только там, функция enterthemechange отключает записи и кнопку на странице при нажатии кнопки входа в систему.
import customtkinter
from PIL import Image, ImageTk
import pyglet
root = customtkinter.CTk()
root.geometry("610x600")
root.resizable(False, False)
root.configure(fg_color = "black")
def Pbarl():
plogin = customtkinter.CTkProgressBar(root,
orientation = "horizontal", height=15, width=300,
fg_color = "black",border_width=2, border_color = "white",
progress_color = "white", determinate_speed=0.2)
plogin.grid(row=4, column=1, pady=10)
plogin.step()
plogin.set(0)
plogin.start()
def EntryColorChange():
b3.configure(fg_color = "white", text_color = "black",
state = "disabled")
e3.configure(text_color = "black", fg_color = "white",
state = "disabled")
e4.configure(text_color = "black", fg_color = "white",
state = "disabled")
b3 = customtkinter.CTkButton(root, text = "Login",
text_color = "white", fg_color = "black", font=("Bold", 17),
height=32, width=150, border_width=1, corner_radius=20,
border_color = "white", hover_color = "white", command= lambda :
(Pbarl(), EntryColorChange()))
b3.grid(row=5, column=1, pady=50)
b4 = customtkinter.CTkButton(root, text = "Dark",
text_color = "white", fg_color = "black", width=30, height=25,
border_width=1, border_color = "white", corner_radius=20,
hover_color = "white")
b4.grid(row=0, column=2)
img3 = customtkinter.CTkImage(Image.open("Username icon 2.JPG"),
size= (27, 27))
img4 = customtkinter.CTkImage(Image.open("Password icon 3.PNG"),
size= (27, 27))
l4 = customtkinter.CTkLabel(root, text = "LOGIN", font=
("bold",40),
text_color = "white")
l4.grid(row=0, column=1, padx=15, pady=30)
l5 = customtkinter.CTkLabel(root, text = "", text_color = "white",
image=img3)
l5.grid(row=1, column=0, padx=7)
l6 = customtkinter.CTkLabel(root, text = "", text_color = "white",
image=img4)
l6.grid(row=2, column=0)
l7 = customtkinter.CTkLabel(root, text = "")
l7.grid(row=3, column=1)
e3 = customtkinter.CTkEntry(root, width=300, height=30,
corner_radius=20, placeholder_text = " Username",
placeholder_text_color = "white", font=("Bold", 17),
fg_color = "black", border_width=1, border_color = "white")
e3.grid(row=1, column=1, pady=10, ipadx=100)
e4 = customtkinter.CTkEntry(root, width=300, height=30,
corner_radius=20, placeholder_text = " Password",
placeholder_text_color = "white", font=("Bold", 17),
fg_color = "black", border_width=1, border_color = "white")
e4.grid(row=2, column=1, pady=10, ipadx=100)
root.mainloop()
Предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.
я только что отредактировал и добавил код, спасибо, что уделили время моей проблеме
Трудно помочь вам, не зная, что вы пробовали и чего именно пытаетесь достичь. Однако вот пример того, как можно выполнить своего рода цикл, не блокирующий основной цикл. (Я полагаю, вы использовали что-то вроде sleep()
в своем цикле, что также приводит к приостановке основного цикла. Это, в свою очередь, замораживает ваш графический интерфейс!)
from customtkinter import CTk, CTkButton, CTkProgressBar
class LoginProgress(CTk):
def __init__(self):
super().__init__()
CTkButton(self, text='Login', command=self.login).pack(pady=10)
# create a progressbar which fills up in 10 steps (by 0.1 each step)
self.prgrs = CTkProgressBar(self, width=200, determinate_speed=5)
self.prgrs.pack(pady=(0, 10), padx=5)
# set it to start at 0
self.prgrs.set(0)
def login(self):
if self.prgrs.get() < 0.9:
# add 0.1 to progress value as determined in determinate_speed
# you could also set a value using self.prgrs.set()
self.prgrs.step()
# recursive call of login after 0.1sec to mimic a loop that is non blocking
self.after(100, self.login)
else:
# finally set the Value to 1 to show a complete progressbar
self.prgrs.set(1)
if __name__ == '__main__':
app = LoginProgress()
app.mainloop()
Если login
на самом деле делает что-то трудоемкое, и вы хотите показать ход выполнения этой функции, вы можете добавить методы .step()
или .set()
в свой реальный код, а затем вызвать update()
, чтобы заставить основной цикл отображать изменение значения на индикаторе выполнения:
def actual_login(self):
self.prgrs.set(0.2) # manually set the value to resemble 20% completeness
self.update()
important_stuppf() # do something time consuming
self.prgrs.set(0.5) # set to 50%
self.update()
another_lengthy_task() # do something time consuming
self.prgrs.set(0.8) # set to 80%
self.update()
final_steps_of_function() # do something time consuming
self.prgrs.set(1) # set to complete
self.update()
я только что отредактировал и добавил код в ветку, не могли бы вы просмотреть проблему сейчас и посмотреть, изменится ли ваш ответ? Я очень ценю, что вы потратили время и написание кода только для моей проблемы, и прошу прощения за неудобства при объяснении моей проблемы.
Использование plogin.start()
, которое не заканчивается до тех пор, пока вы где-нибудь не используете plogin.stop()
(то есть оно начинается снова!). Поэтому вместо этого используйте одно из предложенных решений, либо устанавливая значения ежегодно, либо используя step()
. Например. замените все после вызова grid
Pbarl
на следующий цикл: for i in range(1, 1001):
сначала в цикле plogin.set(i/1000)
затем root.update()
@MTSAGA, удалось ли вам реализовать мое решение? Если да, пожалуйста, рассмотрите возможность принятия ответа
Мне очень жаль, что я был очень занят в течение последнего месяца и у меня не было времени проверить этот сайт. Я очень ценю, что вы потратили время и предложили решение, а также проверили меня, попробую и скажу сегодня, спасибо !!! !
Спасибо!!! это сработало, очень ценю это и прошу прощения за столь поздний ответ, отмечу проблему как решенную!
Хорошо, текст, написанный заглавными буквами, совершенно не нужен, но можете ли вы предоставить часть своего реального кода, касающегося индикатора выполнения, вместо того, чтобы просто описывать его? чтобы нам было проще помогать