Tkinter und wx.Python....geht das zusammen???

Plattformunabhängige GUIs mit wxWidgets.
Antworten
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

hi leute,
als neuling habe ich grad ein riesenproblem, das ich schon laenger nicht geloest bekomme.
(ich hoffe, ich bin hier im korrekten bereich).
ich habe unten meinen code (stark abgespeckt) aufgeführt, der denke ich (zum kopieren) laufbereit ist.

ich benutze windows 8 und python 2.6. damit habe ich mit Tkinter eine kontoverwaltung erstellt, in der man u.a.
ein konto waehlen kann, sich aber auch zusätzlich ueber einen button (konten anzeigen) eine uebersicht der bereits vorhanden konten ausgeben
lassen kann (Kontotabelle, die bei mir auch geordnete Adressen ausgibt). die tabelle wird mit wx.Python erstellt. soweit so gut :)

wenn man sich also die konten anzeigen lässt, soll man parallel ein konto eingeben können und mit anschliessender bestaetigung soll das tabellenfenster
wieder geschlossen werden.
kann mir jemand von euch helfen, was man da als code eingibt?

hier mein code:


Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf8 -*-

from Tkinter import *
import tkMessageBox
import ctypes
import pickle
import os
import wx
import wx.grid
from operator import itemgetter, attrgetter, methodcaller
import time

class Verwaltung(object):

    def konto(self):
        pass

# Tkinter Klasse -----------------------------------------------------------------------------------------------------------------------------
# Fenster: Startbildschirm (Konto waehlen und beenden)---------

        def hauptStart():

            hfenster = Tk()
            hfenster.title('GUI-Verwaltung')
            hfenster.geometry('600x400+500+200')

            label1 = Label(hfenster,text="' KONTO-VERWALTUNG '", font=('Arial', 10, 'bold underline'))
            label1.place(relx=.2, rely=.1, anchor="c")

            label4 = Label(hfenster,text='Herzlich willkommen zu DMD-Datasoft \n (...developed by Christian Olling)')
            label4.place(relx=.2, rely=.93, anchor="c")


# Tkinter Klasse --------------------------------------------------------------------------------------------------------------------------------------------------------------

# Erstellen der Kontotabelle mit wx.Python -------------------------------------------------------------------------------------------------------------------------------------

            wx.SetDefaultPyEncoding("iso-8859-15")

            class MyFrame(wx.Frame):

                def __init__(
                    self, parent = None, title = "Example", size = wx.Size(291, 300)):
                    wx.Frame.__init__(self, parent, -1, title, size = size)

                    panel = wx.Panel(self)

                    vbox_main = wx.BoxSizer(wx.VERTICAL)
                    panel.SetSizer(vbox_main)

                    grid = wx.grid.Grid(panel)
                    vbox_main.Add(grid, 1, wx.EXPAND | wx.ALL, 5)

                    grid.SetColLabelSize(30)
                    grid.SetRowLabelSize(25)

#--------------------------------------------------------------------------------------------------------------------------------------------------------------------

                def onClose(self, event):
                    """"""
                    self.Close()            # <--- diesen Befehl moechte ich gern ausserhalb dieser Klasse ansprechen (innerhalb der Klasse funktiert
                                            #      der, aber wie lautet der ausserhalb der geschuetzten wx.python Klasse???

#--------------------------------------------------------------------------------------------------------------------------------------------------------------------

            def daten():
                app = wx.PySimpleApp()
                f = MyFrame()
                f.Center()
                f.Show()
                app.MainLoop()

# wx.Python Klassenende -------------------------------------------------------------------------------------------------------------------------------------------------------------

# Tkinter Klasse --------------------------------------------------------------------------------------------------------------------------------------------------------------
            def kontoWaehlen():
                try:
                    hfenster.destroy()
                except:
                    pass
                u5fenster = Tk()
                u5fenster.title('GUI-Verwaltung')
                u5fenster.geometry('600x300+500+200')

                label50 = Label(u5fenster,text="2. 'AUSWAEHLEN EINES KONTOS'", font=('Arial', 10, 'bold underline'))
                label50.place(relx=.23, rely=.18, anchor="c")
                label51 = Label(u5fenster,text='2.1. Eingeben der zu suchenden Kontonummer', font=('Arial', 9, 'underline'))
                label51.place(relx=.28, rely=.31, anchor="c")
                label52 = Label(u5fenster,text='Herzlich willkommen zu DMD-Datasoft \n (...developed by Christian Olling)')
                label52.place(relx=.2, rely=.91, anchor="c")
                label53 = Label(u5fenster, fg="red")
                label53.place(relx=.6, rely=.645, anchor="c")

                label54 = Label(u5fenster,text='Bitte gib deine Kontonummer ein:')
                label54.place(relx=.34, rely=.5, anchor="c")
                eingabe54 = Entry(u5fenster)
                eingabe54.place(relx=.6, rely=.5, anchor="c")


#----------------------------------------------------------------------------------------------------------------------------------------------

                def kontoWahlausgabe():


                    #Befehl zum Schliessen des Tabellenfensters (nur was???)

#----------------------------------------------------------------------------------------------------------------------------------------------

                    try:
                        u5fenster.destroy()
                    except:
                        pass

                    u6fenster = Tk()
                    u6fenster.title('GUI-Verwaltung')
                    u6fenster.geometry('600x600+500+150')

                    label61 = Label(u6fenster,text="2. 'AUSWAEHLEN EINES KONTOS'", font=('Arial', 10, 'bold underline'))
                    label61.place(relx=.23, rely=.08, anchor="c")
                    label62 = Label(u6fenster,text='2.2. Ausgeben des gewaehlten Kontos', font=('Arial', 9, 'underline'))
                    label62.place(relx=.25, rely=.14, anchor="c")
                    label63 = Label(u6fenster,text='Herzlich willkommen zu DMD-Datasoft \n (...developed by Christian Olling)')
                    label63.place(relx=.2, rely=.94, anchor="c")

                    label64 = Label(u6fenster,text='KONTONUMMER:')
                    label64.place(relx=.47, rely=.2, anchor="e")
                    label65 = Label(u6fenster,text=('ktoNum'))
                    label65.place(relx=.49, rely=.2, anchor="w")

                    label66 = Label(u6fenster,text='VORNAME:')
                    label66.place(relx=.47, rely=.24, anchor="e")
                    label67 = Label(u6fenster,text=('vorname'))
                    label67.place(relx=.49, rely=.24, anchor="w")

                    label68 = Label(u6fenster,text='NACHNAME:')
                    label68.place(relx=.47, rely=.28, anchor="e")
                    label69 = Label(u6fenster,text=('nachname'))
                    label69.place(relx=.49, rely=.28, anchor="w")

                    label600 = Label(u6fenster,text='GEBURTSDATUM:')
                    label600.place(relx=.47, rely=.32, anchor="e")
                    label601 = Label(u6fenster,text=('gebdat'))
                    label601.place(relx=.49, rely=.32, anchor="w")

                    label602 = Label(u6fenster,text='PLZ / WOHNORT:')
                    label602.place(relx=.47, rely=.36, anchor="e")
                    label603 = Label(u6fenster,text=('wohnort'))
                    label603.place(relx=.49, rely=.36, anchor="w")

                    label604 = Label(u6fenster,text='2.3. Anpassen der Arbeits- und Pausenzeiten', font=('Arial', 9, 'underline'))
                    label604.place(relx=.29, rely=.43, anchor="c")

                    label606 = Label(u6fenster,text='ARBEITSSTUNDEN:')
                    label606.place(relx=.47, rely=.5, anchor="e")
                    label607 = Label(u6fenster,text=("(Std.)"))
                    label607.place(relx=.49, rely=.5, anchor="w")

                    eingabe608 = Entry(u6fenster)
                    eingabe608.place(relx=.69, rely=.54, anchor="e")

                    label609 = Label(u6fenster,text=('----->'), fg="red")
                    label609.place(relx=.705, rely=.54, anchor="w")

                    label610 = Label(u6fenster,text=('(Bspw.: 8, 8.75, ...)'))
                    label610.place(relx=.655, rely=.575, anchor="e")

                    label611 = Label(u6fenster,text=('-------------------------------------------------------------------------------------'))
                    label611.place(relx=.5, rely=.62, anchor="c")

                    label612 = Label(u6fenster,text='FRUEHSTUECKSPAUSE:')
                    label612.place(relx=.47, rely=.66, anchor="e")
                    label613 = Label(u6fenster,text=('1. Pause'))
                    label613.place(relx=.49, rely=.66, anchor="w")
                    label614 = Label(u6fenster,text='MITTAGSPAUSE:')
                    label614.place(relx=.47, rely=.7, anchor="e")
                    label615 = Label(u6fenster,text=('2. Pause'))
                    label615.place(relx=.49, rely=.7, anchor="w")

                    def speichernWaehlen(ktoNum,vorname,nachname,gebdat,wohnort,ktoStand,erstePause,zweitePause):
                        print "Diese Funktion nicht weiter beachten :)"

                        def zurueckStunden():
                            u8fenster.destroy()
                            kontoWaehlen()

                        b_81 = Button(u8fenster, text = 'Zurueck zur Kontoauswahl',command=zurueckStunden)
                        b_81.place(relx=.77, rely=.74, anchor="c")

                        b_30 = Button(u7fenster, text = 'Bestaetigen')
                        b_30.place(relx=.78, rely=.75, anchor="c")

                    b_u61 = Button(u6fenster, text = 'Bestaetigen!', fg="red")
                    b_u61.place(relx=.9, rely=.54, anchor="e")

                    b_u62 = Button(u6fenster, text = 'Pausenzeiten aendern')
                    b_u62.place(relx=.9, rely=.68, anchor="e")

                    b_u63 = Button(u6fenster, text = 'Speichern',command=ktoUebergeben)
                    b_u63.place(relx=.9, rely=.77, anchor="e")

                    def zurueckWahlausgabe():
                        u6fenster.destroy()
                        kontoWaehlen()

                    b_u64 = Button(u6fenster, text = ' Zurueck  ',command=zurueckWahlausgabe)
                    b_u64.place(relx=.9, rely=.85, anchor="e")

#---------------Button der die Kontotabelle schliessen soll -------------------------------------------------------------------------------------------------------------------

                b_u51 = Button(u5fenster, text = 'Bestaetigen',command=kontoWahlausgabe)
                b_u51.place(relx=.84, rely=.5, anchor="c")

#-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
                b_u52 = Button(u5fenster, text = 'Konten anzeigen',command=daten)
                b_u52.place(relx=.84, rely=.35, anchor="c")

                def zurueckWaehlen():
                    u5fenster.destroy()
                    hauptStart()

                b_u52 = Button(u5fenster, text = ' Zurueck   ',command=zurueckWaehlen)
                b_u52.place(relx=.84, rely=.8, anchor="c")

            # Button: Konto waehlen --------------------------------------------

            b_h2 = Button(hfenster, text = "   KONTO WAEHLEN    ",font=('Arial', 10, 'bold'),command=kontoWaehlen)
            b_h2.place(relx=.55, rely=.4, anchor="c")

            # Button: alles Beenden --------------------------------------------

            def beenden():
                hfenster.destroy()

            b_h4 = Button(hfenster, text = "         BEENDEN            ",font=('Arial', 10, 'bold'),command=beenden)
            b_h4.place(relx=.55, rely=.6, anchor="c")

            hfenster.mainloop()
        hauptStart()

# Tkinter Klasse --------------------------------------------------------------------------------------------------------------------------------------------------------------

Verwaltung = Verwaltung()
Verwaltung.konto()

ich würde mich sehr über hilfe freuen...
Zuletzt geändert von Anonymous am Dienstag 23. Juni 2015, 15:00, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@DMD: Das sieht alles sehr merkwürdig aus. Und ich würde mich auf ein GUI-Toolkit beschränken, denn ob man die tatsächlich mischen kann bezweifle ich.
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

ja, hab ich mir schon gedacht :)

das problem is aber leider, dass ich table wegen dem hdf5dll.dll fehler nicht installieren kann.
daher hab ich es so versucht. gibs irgendwo gute anleitungen wie man mit python vernünftige tabellen erstellen kann?
BlackJack

@DMD: Ich vermute Du bringst da einiges durcheinander. Die hdf5.dll hat mit GUIs nichts zu tun, sondern mit dem speichern von hierarchisch organisierten mehrdimensionalen Arraystrukturen. Ein Tabellen-Widget hat eigentlich jedes GUI-Rahmenwerk ausser `Tkinter`. Wieso machst Du die GUI nicht komplett in wxPython?
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

ACH SO.
dann setz ich mich mal ran. ...dachte wx is ausschließlich zur erstellung von tabellen nutze... :)
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

DANKEEEEE
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

könnte ich das nicht auch mit sqlite machen..
da bin ich grad bei. kann man damit auch tabellen erstellen. das wär optimal!
...und bitte sag jetzt, ja das geht!!!
Benutzeravatar
Kebap
User
Beiträge: 686
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

SQL verwaltet Daten in einem Tabellenformat, hilft aber imho nicht dabei, Daten irgendwo als Tabelle anzuzeigen.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
BlackJack

@DMD: Du schmeisst da irgendwie gerade alles in einen Topf was ”Tabelle” genannt werden kann, obwohl das teilweise sehr verschiedene Dinge sind.
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

ich bin totaler anfänger. sorry. ich möchte es gern lernen...
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Also, das geht natürlich schon zusammen oder auch auseinander. Nur in der Haupttask sollte tkinter laufen und für wx machst Du dann einen extra Thread. Aber zwei GUI mainloops in einem Thread das solltest Du lassen.

Also in einem File tkinter in der mainloop laufen lassen und in einem anderen File völlig getrennt davon in einem Thread wx.
Und wenn man eh schon zwei getrennte GUIs hat, dann sollte man die Logik hierfür noch in einem extra Thread laufen lassen.
BlackJack

@Alfons Mittelmeyer: So natürlich ist das nicht, es kann durchaus Systeme geben bei denen das Fenstersystem nicht darauf ausgelegt ist das ein Prozess da parallel von zwei Threads aus drauf zugreift und sich die beiden GUI-Rahmenwerke dann um ”globale” Ereignisse ringen, d.h. nur eins der beiden bekommt die dann aus der Warteschlange, welches halt zufällig als erstes angefragt hat. Ich sehe auch keinen vernünftigen Grund zwei GUI-Rahmenwerke parallel zu verwenden.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@BlackJack Globale Ereignisse hat es keine zu geben. Es geht nur immer um Ereignisse in dem betreffenden Thread und kein Thread hat auf etwas in einem anderen Thread zuzugreifen. Wenn, dann hat ein Thread ein Ereignis an einen anderen zu melden mit etwaiger Weitergabe von Daten.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@Alfons Mittelmeyer: gut, dass Du die beiden beteiligten Frameworks auf allen Plattformen so gut kennst, um das sagen zu können. :evil:
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@Sirius3 Ja da hast Du schon recht. Wenn jemand diie Maus bewegt, wer bekommt das dann, tkinter oder wx. Ich würde denken, wenn es ein wxPython Fenster ist, bekommt es wohl wxPython und wenn es ein tkinter Fenster ist, dann wohl tkinter. Wenn es da dann doch Probleme gibt, kann man statt zwei getrennte Threads auch zwei getrennte Anwendungen machen, die über TCP kommunizieren.. Das sollte dann aber problemlos sein.
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Oder, man macht es einfach so, wie es alle anderen tun und entscheidet sich für ein Toolkit. Im besten Fall das, das bereits alle Features hat, die man braucht, und spart sich diese komische Gefrickel. :roll:
Antworten