• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Python i Tkinter - jedno okno dla całego programu

VPS Starter Arubacloud
0 głosów
1,925 wizyt
pytanie zadane 30 października 2017 w Python przez Dawid89 Obywatel (1,100 p.)
Piszę prosty program i chce aby po kliknięciu Buttona program przechodził dalej ale w tym samym oknie. Nie wiem jak ustawić Frame dla całego programu na stałe. W tej chwili gdy klikam wyskakuje kolejne a poprzednie nadal się wyświetla - to jedyne co mi wyszło do tej pory a wiem, że jest źle bo dla każdej funkcji stworzyłem osobne okno po prostu.

A drugie pytanie to jak w Entry wyświetlić wartość z Buttona(klikam np przycisk wylicz i wyświetla mi się w Entry)

Męczę się z tym od wczoraj i już nie mam pomysłu.
komentarz 30 października 2017 przez mokrowski Mędrzec (155,460 p.)
Pokażesz kod czy mam iść na strych po szklaną kulę? :-)
komentarz 30 października 2017 przez Dawid89 Obywatel (1,100 p.)
No tak...:)

from tkinter import *
import PasswordGenerator as pass_gen

def startProgram():
    root = Tk()
    root.title("Hasło")
    topFrame = Frame(root)
    topFrame.grid(row=0, column=0)
    button1 = Button(topFrame, text="Kliknij aby rozpocząć program", command=choiceButtons, bg="#53536d", fg="#e0abdd")
    button1.grid(row=0)
    root.mainloop()
def choiceButtons():
    root = Tk()
    root.title("Hasło")
    topFrame = Frame(root)
    topFrame.grid(row=0, column=0)
    button1 = Button(topFrame, text="Wygeneruj hasło automatycznie", command=pass_gen.password_main_question, bg="#53536d", fg="#e0abdd")
    button2 = Button(topFrame, text="Ustaw parametry dla hasła", command=pass_gen.password_main_parameters, bg="#53536d", fg="#e0abdd")
    button1.grid(row=0)
    button2.grid(row=0, column=1)
    root.mainloop()
def passwordTypeButtons():
    root = Tk()
    root.title("Hasło")
    topFrame = Frame(root)
    topFrame.grid(row=0, column=0)
    button1 = Button(topFrame, text="x", command=pass_gen.unbreak_password, bg="#53536d", fg="#e0abdd")
    button2 = Button(topFrame, text="y", command=pass_gen.strong_password, bg="#53536d", fg="#e0abdd")
    button3 = Button(topFrame, text="z", command=pass_gen.normal_password, bg="#53536d", fg="#e0abdd")
    entry_1 = Entry(root)
    entry_1.grid(row=1)
    button1.grid(row=0)
    button2.grid(row=0, column=1)
    button3.grid(row=0, column=2)
    root.mainloop()

 

2 odpowiedzi

0 głosów
odpowiedź 30 października 2017 przez mokrowski Mędrzec (155,460 p.)

Tryb "minimalne poprawki maksimum efektu". Oczywiście można o wiele bardziej estetycznie, ale na przyszłość proszę podaj także choćby "kadłubek" modułu tak bym nie pisał pustych funkcji. Nie widzę całości aplikacji więc nie sugerowałem dziedziczenia z Frame. Myśle jednak że to jest rozsądne. Także sam konstruktor może kończyć się wejściem w pętlę zdarzeń. Nie widząc jednak całości aplikacji, nie implementowałem tego. Nie wiem czy to będzie główna klasa całości aplikacji

from tkinter import *
import PasswordGenerator as pass_gen

class PasswordProgram:
    def __init__(self):
        self._root = Tk();
        self._root.title("Hasło")
        self._topFrame = Frame(self._root)
        self._topFrame.grid(row = 0, column = 0)

    def startProgram(self):
        button1 = Button(self._topFrame, text="Kliknij aby rozpocząć program", command=self.choiceButtons, bg="#53536d", fg="#e0abdd")
        button1.grid(row=0)
        self._root.mainloop()

    def choiceButtons(self):
        button1 = Button(self._topFrame, text="Wygeneruj hasło automatycznie", command=pass_gen.password_main_question, bg="#53536d", fg="#e0abdd")
        button2 = Button(self._topFrame, text="Ustaw parametry dla hasła", command=pass_gen.password_main_parameters, bg="#53536d", fg="#e0abdd")
        button1.grid(row=0)
        button2.grid(row=0, column=1)

    def passwordTypeButtons(self):
        button1 = Button(self._topFrame, text="x", command=pass_gen.unbreak_password, bg="#53536d", fg="#e0abdd")
        button2 = Button(self._topFrame, text="y", command=pass_gen.strong_password, bg="#53536d", fg="#e0abdd")
        button3 = Button(self._topFrame, text="z", command=pass_gen.normal_password, bg="#53536d", fg="#e0abdd")
        entry_1 = Entry(self._root)
        entry_1.grid(row=1)
        button1.grid(row=0)
        button2.grid(row=0, column=1)
        button3.grid(row=0, column=2)

if __name__ == '__main__':
    pwProgram = PasswordProgram()
    pwProgram.startProgram()

 

komentarz 30 października 2017 przez Dawid89 Obywatel (1,100 p.)

Problem jest taki, że dopiero raczkuje w kwestii klas czy np metody __init__ . Podaje jeszcze dotychczasowe main.py i PasswordGenerators.py. Jak się teraz do nich odwołać? 

Main:

from gui import startProgram

def description():
    print("""         Witaj w programie. """)


description()
startProgram()

PasswordGenerators:

 

import random
import string
import gui


def password_main_question():
    print("Wybierz jakie chcesz mieć hasło :")
    passwordTypeButtons()

#Funkcje Generujące losowe hasło
def unbreak_password():

    random_choice = random.choice(string.ascii_letters+string.digits+string.punctuation)
    number = 0
    x = ''
    while number != 15:
        number += 1
        x += random_choice
        random_choice = random.choice(string.ascii_letters+string.digits+string.punctuation)
    return print(x)

def strong_password():
    random_choice = random.choice(string.ascii_letters+string.digits)
    number = 0
    x = ''
    while number != 15:
        number += 1
        x += random_choice
        random_choice = random.choice(string.ascii_letters+string.digits)
    return print(x)

def normal_password():
    random_choice = random.choice(string.ascii_letters+string.digits)
    number = 0
    x = ''
    while number != 8:
        number += 1
        x += random_choice
        random_choice = random.choice(string.ascii_letters+string.digits)
    return print(x)

 

komentarz 30 października 2017 przez mokrowski Mędrzec (155,460 p.)

Masz błąd w logice aplikacji. Można np. uruchomić główny obiekt aplikacji i przekazać funkcje z PasswordGenerators tak aby obiekt je wykorzystał. Nie będę teraz poprawiał Ci logiki. Aby przekazać jak wywołać funkcję, wystarczy przekazać obiekt przez opakowanie w lambdzie bo akcje mają mieć funkcje bez argumentów. Nie wiem także co to za moduł gui. Masz także wielce dyskusyjną konstrukcję z return print(...). Po co? Interesuje Cię co zwraca print? Lepiej np. zwrócić ten x (czyli hasło) do głównej aplikacji niż go "printować".

Znów w trybie "minimalne poprawki".

PasswordGenerator.py:

import random
import string
# import gui # Co to jest gui?


# Tu przyjmuje obiekt posiadający passwordTypeButtons
def password_main_question(pwdObject):
    print("Wybierz jakie chcesz mieć hasło :")
    pwdObject.passwordTypeButtons()

#Funkcje Generujące losowe hasło
def unbreak_password():

    random_choice = random.choice(string.ascii_letters+string.digits+string.punctuation)
    number = 0
    x = ''
    while number != 15:
        number += 1
        x += random_choice
        random_choice = random.choice(string.ascii_letters+string.digits+string.punctuation)
    print(x)

def strong_password():
    random_choice = random.choice(string.ascii_letters+string.digits)
    number = 0
    x = ''
    while number != 15:
        number += 1
        x += random_choice
        random_choice = random.choice(string.ascii_letters+string.digits)
    print(x)

def normal_password():
    random_choice = random.choice(string.ascii_letters+string.digits)
    number = 0
    x = ''
    while number != 8:
        number += 1
        x += random_choice
        random_choice = random.choice(string.ascii_letters+string.digits)
    print(x)

def password_main_parameters():
    pass # Co to jest za metoda. Nie ma jest w tym module a chcesz ją wołać...

main.py:

from tkinter import *
import PasswordGenerator as pass_gen

class PasswordProgram:
    def __init__(self):
        self._root = Tk();
        self._root.title("Hasło")
        self._topFrame = Frame(self._root)
        self._topFrame.grid(row = 0, column = 0)

    def startProgram(self):
        button1 = Button(self._topFrame, text="Kliknij aby rozpocząć program", command=self.choiceButtons, bg="#53536d", fg="#e0abdd")
        button1.grid(row=0)
        self._root.mainloop()

    def choiceButtons(self):
        # Tu masz opakowującą lambdę
        button1 = Button(self._topFrame, text="Wygeneruj hasło automatycznie", command=lambda: pass_gen.password_main_question(self), bg="#53536d", fg="#e0abdd")
        button2 = Button(self._topFrame, text="Ustaw parametry dla hasła", command=pass_gen.password_main_parameters, bg="#53536d", fg="#e0abdd")
        button1.grid(row=0)
        button2.grid(row=0, column=1)

    def passwordTypeButtons(self):
        button1 = Button(self._topFrame, text="x", command=pass_gen.unbreak_password, bg="#53536d", fg="#e0abdd")
        button2 = Button(self._topFrame, text="y", command=pass_gen.strong_password, bg="#53536d", fg="#e0abdd")
        button3 = Button(self._topFrame, text="z", command=pass_gen.normal_password, bg="#53536d", fg="#e0abdd")
        entry_1 = Entry(self._root)
        entry_1.grid(row=1)
        button1.grid(row=0)
        button2.grid(row=0, column=1)
        button3.grid(row=0, column=2)

if __name__ == '__main__':
    pwProgram = PasswordProgram()
    pwProgram.startProgram()

 

komentarz 30 października 2017 przez Dawid89 Obywatel (1,100 p.)
edycja 30 października 2017 przez Dawid89
moduł gui to ten pierwszy kod który mi poprawiłeś (widzę, że go zamieniłeś z main)

ok, zaraz przeanalizuję co napisałeś i spróbuję ogarnąć :)
0 głosów
odpowiedź 30 października 2017 przez obl Maniak (51,280 p.)

Do kontrolki entry możesz wstawić tekst w taki sposób:

text = tk.StringVar() # tworzysz specjalną zmienną
entry = tk.Entry(window,width=40, textvariable = text) # podpinasz pod kontrolkę
text.set("Text w Entry") # za jej pomocą możesz zmieniać tekst wyświetlany w podpiętej do niej kontrolce

 

Podobne pytania

0 głosów
1 odpowiedź 189 wizyt
pytanie zadane 1 października 2022 w Python przez MarcelM Początkujący (340 p.)
0 głosów
1 odpowiedź 280 wizyt
pytanie zadane 24 lutego 2023 w Python przez zygota Nowicjusz (140 p.)
0 głosów
1 odpowiedź 818 wizyt

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...