2017-08-17 5 views
-1

Ich konnte keine funktionierende Antwort für diese Frage finden, die ich habe. Ich möchte eine Python-GUI erstellen, die Gesundheit, Schaden/Schuss, Feuerrate, Zeit zum Töten, Schüsse zum Töten, so ziemlich jede Variable in diesem Code anzeigt, aber ich habe keine Ahnung, wie ich das konstruiere, was ich brauche. Es muss ein einfaches Fenster mit einem farbigen Balken (wie ein prozentualer Download-Balken) in der Mitte mit einem Knopf darunter sein, um die Simulation zu aktivieren (wie schnell würde der Tod tatsächlich mit dieser speziellen Waffe geschossen werden) und Beschriftungen oben in einem Art von Liste. Wenn der Balken leer ist (von voller Gesundheit auf Null in Echtzeit), muss er bleiben, also brauche ich auch eine Schaltfläche, um die Simulation mit denselben Variablenwerten zu aktualisieren. Hier ist mein Code (das ist genau das, was ich brauche es den GUI-Teil zu tun, speichern):Build und Update GUI Status/Fortschrittsbalken

#import module for update frequency 
import threading 

#user inputs health 
health = float(input("Enter health:")) 

#user inputs how much damage each bullet does 
dps = float(input("Enter Damage per shot:")) 

#user inputs the fire rate of the weapon 
spm = float(input("Enter Fire Rate:")) 

#from user inputs establish how many shots it takes to reduce health to or below zero 
if ((health/dps).is_integer()) is False: #checks if the stk value will be a float 
    stk = int(health/dps) + 1 #since stk value is a float go up to next whole number. 33dps doesn't kill in 3 shots. 
else: #if stk value is an integer, establishes stk variable 
    stk = health/dps 

delay_in_seconds = float(60/spm) 

#establishes the time to kill in seconds, take one from stk to account for delay of gunfire  
ttk = ((stk - 1) * delay_in_seconds) 

#test on how to test for frequency of updating GUI once I figure out how in the heck to build it 
def DPS_Timer(): 
    threading.Timer(float((ttk/stk)), DPS_Timer).start() 

#calls my god forsaken function 
DPS_Timer() 

Jede GUI-Modul genügt, ich versuche, mit Tkinter und es funktionierte nie für mich. Ich habe auch die Tkinter-Dokumentation für Python 2.7.13 gelesen und konnte nicht genau herausfinden, was ich tun musste. Wenn zum Beispiel 4 Schüsse benötigt wurden, um einen gegnerischen Spieler zu töten, und diese 4 Schüsse über eine Minute verstrichen sind, müsste diese Fortschritts-/Statusleiste alle (ttk/stk) Sekunden (Gesundheit/Stk)% reduzieren. also bei 100 Gesundheit, 25% alle 15 Sekunden.

+0

Ihre Frage ist ein bisschen komplex und kann hier nicht gründlich beantwortet werden. Ich persönlich benutze PyQt5. Es gibt einen Designer (http://pyqt.sourceforge.net/Docs/PyQt5/designer.html), wo Sie alle gewünschten Ladebalken und Drucktasten mit Ihrer Maus platzieren können. Dann müssen Sie jedes mit Ihren Funktionen verknüpfen. Wenn Sie noch nie eine GUI geschrieben haben, seien Sie auf die Lernkurve vorbereitet. Es könnte einfacher sein, Designer nicht zu verwenden, wenn Sie mit "blindem Zeichnen" einverstanden sind. – Wli

Antwort

0

Dies ist mein sehr unordentlicher Testcode, um mein GUI-Problem zu lösen. Immer noch nicht 100%, was ich auf der ttk.Progressbar() will, aber es tut seinen Job speichern, wenn es 100% erreicht, wird es vor dem Anhalten zurückgesetzt.

#import module for update frequency and gui. ttk for progressbar 
import threading,ttk 
from Tkinter import * 

#establishes counter for testing purposes 
counter = 0 

#establish window 
root = Tk() 

def main(): 
    #user inputs health 
    health = float(input("Enter health:")) 

    #user inputs how much damage each bullet does 
    dps = float(input("Enter Damage per shot:")) 

    #user inputs the fire rate of the weapon 
    spm = float(input("Enter Fire Rate:")) 

    #from user inputs establish how many shots it takes to reduce health to or below zero 
    if ((health/dps).is_integer()) is False: #checks if the stk value will be a float 
     stk = int(health/dps) + 1 #since stk value is a float go up to next whole number. 33dps doesn't kill in 3 shots. 
    else: #if stk value is an integer, establishes stk variable 
     stk = health/dps 

    delay_in_seconds = float(60/spm) 
    # delay_in_milliseconds = float(delay_in_seconds*1000) 

    #establishes the time to kill in seconds, take one from stk to account for delay of gunfire 
    ttki = ((stk - 1) * delay_in_seconds) 

    print int((ttki * 1000))/stk, int(ttki), stk,health, health/stk, range(int(stk)) 

    # establish progressbar 
    progre = ttk.Progressbar(root, orient='horizontal', maximum=health, mode='determinate') 
    progre.pack(fill=X) 

    # test on how to test for frequency of updating GUI once I figure out how in the heck to build it 
    def DPS_Timer(): 
     global counter 
     print counter 
     if counter != (stk-1): 
      counter += 1 
      progre.step(float((health/stk))) 
      root.after(int(ttki*1000/stk), DPS_Timer) 
     else: 
      progre.stop() 


    # establish GUI Button 
    B1 = Button(root, text='start', command=DPS_Timer).pack(fill=X) 

    root.mainloop() 

main()