Остановка индикатора выполнения на Max , customtkinter

поэтому я сделал индикатор выполнения для своей страницы входа в свое приложение в 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()

Хорошо, текст, написанный заглавными буквами, совершенно не нужен, но можете ли вы предоставить часть своего реального кода, касающегося индикатора выполнения, вместо того, чтобы просто описывать его? чтобы нам было проще помогать

Aiden Chow 18.04.2024 08:10

Предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.

Community 18.04.2024 09:17

я только что отредактировал и добавил код, спасибо, что уделили время моей проблеме

MTSAGA 18.04.2024 17:23
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Трудно помочь вам, не зная, что вы пробовали и чего именно пытаетесь достичь. Однако вот пример того, как можно выполнить своего рода цикл, не блокирующий основной цикл. (Я полагаю, вы использовали что-то вроде 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()

я только что отредактировал и добавил код в ветку, не могли бы вы просмотреть проблему сейчас и посмотреть, изменится ли ваш ответ? Я очень ценю, что вы потратили время и написание кода только для моей проблемы, и прошу прощения за неудобства при объяснении моей проблемы.

MTSAGA 18.04.2024 17:26

Использование plogin.start(), которое не заканчивается до тех пор, пока вы где-нибудь не используете plogin.stop() (то есть оно начинается снова!). Поэтому вместо этого используйте одно из предложенных решений, либо устанавливая значения ежегодно, либо используя step(). Например. замените все после вызова gridPbarl на следующий цикл: for i in range(1, 1001): сначала в цикле plogin.set(i/1000) затем root.update()

Jan_B 19.04.2024 08:44

@MTSAGA, удалось ли вам реализовать мое решение? Если да, пожалуйста, рассмотрите возможность принятия ответа

Jan_B 25.04.2024 14:10

Мне очень жаль, что я был очень занят в течение последнего месяца и у меня не было времени проверить этот сайт. Я очень ценю, что вы потратили время и предложили решение, а также проверили меня, попробую и скажу сегодня, спасибо !!! !

MTSAGA 15.05.2024 08:50

Спасибо!!! это сработало, очень ценю это и прошу прощения за столь поздний ответ, отмечу проблему как решенную!

MTSAGA 15.05.2024 08:59

Другие вопросы по теме