Seite 1 von 2

Warum sieht ein Gui unter Linux nicht schön aus?(Anfänger)

Verfasst: 12.07.2018 15:29
von aixwanderer
Ich habe ein GUI-Beispiel mit Purebaisc programmiert. Das Programm läuft unter Windows gut, die GUI sieht gut aus. Dann habe ich das gleichen Programm unter Linux Minte 19 Mate laufen gelassen. warum sieht die GUI nicht schön wie unter Windows aus. Außdem funktioniert #PB_TEXT_RIGHT und SetWindowColor(0, $EAD1B9) nicht mehr. Die Hntergrundfarbe vom Fenster kann nicht verändert werden.

Code: Alles auswählen

If OpenWindow(0, 0, 0, 500, 400, "GUI Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  SetWindowColor(0, $EAD1B9)
  sPF =StringGadget(1, 30, 20, 80, 22, "0", #PB_String_ReadOnly|#PB_String_Numeric|#PB_Text_Right)
  ButtonGadget(2, 200, 20, 80, 25, "Connect") 
  
EndIf


Repeat
  Event = WaitWindowEvent()
    
  Select Event
    Case #PB_Event_CloseWindow   
      End
      
    Case #PB_Event_Gadget
      Select EventGadget()
          
      EndSelect
   
  EndSelect
  
 ForEver
Gibt es noch andere Möglichkeit, die schöne GUI unter Linux zu bekommen? mit Gtk+ oder ...? Oder muss ich noch was unter Linux Mint 19 Mate installieren?
Bitte um die Hilfe!

Re: Warum sieht ein Gui unter Linux nicht schön aus?(Anfänge

Verfasst: 12.07.2018 15:50
von #NULL
Bei mir ist das Fenster blau, mit pb 5.62 x64, Ubuntu 16.04.
Du kannst mal in den Compiler Options bei Subsystem 'gtk2' eingeben (ohne Anführungszeichen) und gucken ob es anders aussieht, Default ist gtk3. Die Mindestgrößen für GUI Elemente sind mit gkt3 glaube ich anders bzw größer.
Auch überprüfen ob die checkinstall.sh irgendwas vermisst.

<edit>
#PB_Text_Right ist entweder Windows-Only oder sogar nur für TextGadget, jedenfalls ist es nicht zu StringGadget dokumentiert in meiner Linux PB Help.

Re: Warum sieht ein Gui unter Linux nicht schön aus?(Anfänge

Verfasst: 12.07.2018 15:50
von NicTheQuick
Bei mir sieht es gut aus. Allerdings gibt es die Konstante #PB_Text_Right nicht für das StringGadget, die gilt nur für das TextGadget. Dass das unter Windows funktioniert, ist Zufall.
Bild

Re: Warum sieht ein Gui unter Linux nicht schön aus?(Anfänge

Verfasst: 12.07.2018 16:35
von Shardik
Wie NicTheQuick schon gesagt hat, darf die Konstante #PB_Text_Right nur für TextGadgets verwendet werden. Für StringGadgets gibt es in Windows die Konstante #ES_RIGHT, die zufällig denselben Wert 2 wie #PB_Text_Right hat. In Linux muss man dieses Problem anders lösen. Deshalb habe ich in meinem modifizierten Beispiel das Konstrukt CompilerSelect..CompilerEndSelect verwendet, damit abhängig vom verwendeten Betriebssystem die korrekte Lösung verwendet wird:

Code: Alles auswählen

OpenWindow(0, 0, 0, 500, 400, "GUI Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
SetWindowColor(0, $EAD1B9)

CompilerSelect #PB_Compiler_OS
  CompilerCase #PB_OS_Linux
    ImportC ""
      gtk_entry_set_alignment(*Entry.GtkEntry, Alignment.F)
    EndImport

    StringGadget(1, 30, 20, 80, 22, "0", #PB_String_ReadOnly | #PB_String_Numeric)
    gtk_entry_set_alignment(GadgetID(1), 1)
  CompilerCase #PB_OS_Windows
    StringGadget(1, 30, 20, 80, 22, "0", #PB_String_ReadOnly | #PB_String_Numeric | #ES_RIGHT)
CompilerEndSelect

ButtonGadget(2, 200, 20, 80, 25, "Connect")

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Das Ändern der Hintergrundfarbe ist in Linux auf Grund des von PureBasic standardmäßig verwendeten GTK3-Frameworks heikel: der PureBasic-Befehl SetWindowColor() funktioniert abhängig von der verwendeten Linux-Distribution und der installierten Version von GTK3 teilweise nicht. Dies ist nicht die Schuld von PureBasic, sondern die der GTK3-Entwickler, die mehrfach die dazu benötigten internen Funktionen abgeändert haben. Der einfachste Weg zu einem funktionierenden SetWindowColor()-Befehl besteht darin, wie von #NULL vorgeschlagen in der Menüleiste auf Compiler > Compiler Options... zu klicken und im Reiter "Compiler Options" hinter "Library Subsystem:" den Eintrag "gtk2" (ohne Anführungszeichen) vorzunehmen, damit das ältere GTK2-Framework verwendet wird.

Wenn man unbedingt das GTK3-Framework benutzen will oder muss, kann man mit dem folgenden auf 16 verschiedenen Linux-Distributinen erfolgreich getesteten Programm die Hintergrundfarbe des Fensters abändern:

Code: Alles auswählen

; Durchgeführte Tests mit PB 5.62 x86:
; ------------------------------------
; + Bodhi Linux 4.5.0 mit Moksha 0.2.1 und GTK 3.18.9
; + Debian 8 mit Xfce und GTK 3.14.5
; + Elementary OS 0.2.1 'Luna' mit Pantheon und GTK 3.4.2
; + Fedora 27 mit Gnome 3 und GTK 3.22.26
; + Kubuntu 12.04 mit KDE 4 und GTK 3.4.2
; + Kubuntu 14.04 mit KDE 4 und GTK 3.10.8
; + Kubuntu 16.04 mit KDE 5.18.0 und GTK 3.18.9
; + Linux Mint 19 'Tara' mit Cinnamon und GTK 3.22.30
; + Lubuntu 14.04 mit LXDE und GTK 3.10.8
; + OpenSuSE 13.2 mit KDE 4.14.9 und GTK 3.14.15
; + PCLinuxOS 2014.05 MiniMe mit KDE 4 und GTK 3.14.14
; + Ubuntu 17.10 mit Gnome 3 unter Wayland (Unity Theme) und GTK 3.22.25
; + Ubuntu 17.10 mit Gnome 3 unter X.org (Unity Theme) und GTK 3.22.25
; + Ubuntu Budgie 17.10 mit Budgie 10.4 und GTK 3.22.25
; + Xubuntu 16.04 mit Xfce und GTK 3.18.9
; + Xubuntu 18.04 mit Xfce und GTK 3.22.30

EnableExplicit

CompilerIf Subsystem("gtk2")
  MessageRequester("Error",
    "Sorry, this code only works in GTK+ 3!") 
  End
CompilerElse
  ImportC ""
    gtk_css_provider_load_from_data(*CSSProvider, CSSData.P-UTF8, Length.I,
      *Error.GError)
    gtk_css_provider_new()
    gtk_style_context_add_provider(*StyleContext, *StyleProvider, Priority.I)
    gtk_widget_get_style_context(*Widget.GtkWidget)
  EndImport
  
  #GTK_STYLE_PROVIDER_PRIORITY_USER = 800

  Define ContainerWidget.I
  Define CSSProvider.I
  Define CSSData.S
  Define GTK3MinorVersion.I

  Procedure.I GetGTK3MinorVersion()
    Protected GTK3Version.S
    Protected GTK3MinorVersion.I
    Protected ProgramID.I

    ProgramID = RunProgram("pkg-config", "--modversion gtk+-3.0", "",
      #PB_Program_Open | #PB_Program_Read)

    If ProgramID
      GTK3Version = ReadProgramString(ProgramID)
      SetWindowTitle(0, "Current GTK version: " + GTK3Version)
      GTK3MinorVersion = Val(StringField(GTK3Version, 2, "."))
      CloseProgram(ProgramID)
    EndIf

    ProcedureReturn GTK3MinorVersion
  EndProcedure

  OpenWindow(0, 100, 100, 350, 230, "")

  GTK3MinorVersion = GetGTK3MinorVersion()

  If GTK3MinorVersion > 15
   CSSData = "window.background {background-color: yellow;}"
   ContainerWidget = WindowID(0)
  Else
   CSSData = "GtkLayout {background-color: yellow}"
   ContainerWidget = g_list_nth_data_(gtk_container_get_children_(WindowID(0)), 0)
   ContainerWidget = g_list_nth_data_(gtk_container_get_children_(ContainerWidget), 0)
  EndIf

  CSSProvider = gtk_css_provider_new()
  gtk_css_provider_load_from_data(CSSProvider, CSSData, -1, 0)
  gtk_style_context_add_provider(gtk_widget_get_style_context(ContainerWidget),
    CSSProvider, #GTK_STYLE_PROVIDER_PRIORITY_USER)
  g_object_unref_(CSSProvider)

  Repeat
  Until WaitWindowEvent() = #PB_Event_CloseWindow
CompilerEndIf

Re: Warum sieht ein Gui unter Linux nicht schön aus?(Anfänge

Verfasst: 13.07.2018 09:14
von aixwanderer
Vielen, vielen Dank für die schnelle Antwortung und die detaillierte Erklärung! Es ist genau passiert, wie Ihr analysiert habt. Bei mir ist die Option der Compiler leer. #PB_Text_Right ist ein Zufall. Von Euch habe ich viel gelernt!

Re: Warum sieht ein Gui unter Linux nicht schön aus?(Anfänge

Verfasst: 13.07.2018 11:34
von Shardik
Ich habe mein Programm zur Änderung der Hintergrundfarbe von Linux-Fenstern mit GTK3-Framework so umgeschrieben, dass man es als Prozedur mit der gewünschten RGB-Farbe aufrufen kann:

Code: Alles auswählen

EnableExplicit

ImportC ""
  gtk_css_provider_load_from_data(*CSSProvider, CSSData.P-UTF8, Length.I,
    *Error.GError)
  gtk_css_provider_new()
  gtk_style_context_add_provider(*StyleContext, *StyleProvider, Priority.I)
  gtk_widget_get_style_context(*Widget.GtkWidget)
EndImport

#GTK_STYLE_PROVIDER_PRIORITY_USER = 800

Procedure.I GetGTK3MinorVersion()
  Protected GTK3Version.S
  Protected GTK3MinorVersion.I
  Protected ProgramID.I

  ProgramID = RunProgram("pkg-config", "--modversion gtk+-3.0", "",
    #PB_Program_Open | #PB_Program_Read)

  If ProgramID
    GTK3Version = ReadProgramString(ProgramID)
    GTK3MinorVersion = Val(StringField(GTK3Version, 2, "."))
    CloseProgram(ProgramID)
  EndIf

  ProcedureReturn GTK3MinorVersion
EndProcedure

Procedure SetWindowBackColor(WindowID.I, Color.I)
  Protected ContainerWidget.I
  Protected CSSProvider.I
  Protected CSSColor.S
  Protected CSSData.S
  Protected GTK3MinorVersion.I

  CSSColor = "#" + RSet(Hex(Red(Color)), 2, "0") +
    RSet(Hex(Green(Color)), 2, "0") + RSet(Hex(Blue(Color)), 2, "0")
  GTK3MinorVersion = GetGTK3MinorVersion()

  If GTK3MinorVersion > 15
    CSSData = "window.background {background-color: " + CSSColor + ";}"
    ContainerWidget = WindowID(WindowID)
  Else
    CSSData = "GtkLayout {background-color: " + CSSColor + ";}"
    ContainerWidget = g_list_nth_data_(gtk_container_get_children_(WindowID(WindowID)), 0)
    ContainerWidget = g_list_nth_data_(gtk_container_get_children_(ContainerWidget), 0)
  EndIf

  CSSProvider = gtk_css_provider_new()
  gtk_css_provider_load_from_data(CSSProvider, CSSData, -1, 0)
  gtk_style_context_add_provider(gtk_widget_get_style_context(ContainerWidget),
    CSSProvider, #GTK_STYLE_PROVIDER_PRIORITY_USER)
  g_object_unref_(CSSProvider)
EndProcedure

OpenWindow(0, 100, 100, 350, 230, "Window with custom background color")
SetWindowBackColor(0, $EAD1B9)

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow

Re: Warum sieht ein Gui unter Linux nicht schön aus?(Anfänge

Verfasst: 27.07.2018 13:26
von aixwanderer
Shardik, ich habe Deinen Code probiert. Das hat super funktioniert! :D :allright: Vielen Dank! noch eine Frage:

Ich habe ein GUI implementiert, aber wenn ich die Einstellung der Themen von Linux geändert habe, dann wurde einige Sachen des GUI-Programmes auch geändert, wie z.B. die Höhegröße des ButtonGadget wurde verkleinert, dann wurde die Beschriftung nicht vollständig angezeigt.

Gibt es eine Möglichkeit, die Veränderung zu verhindern, ob man die Themen von Linux geändert hätte?

Re: Warum sieht ein Gui unter Linux nicht schön aus?(Anfänge

Verfasst: 30.07.2018 22:07
von Shardik
Mit verschiedenen Themen unter Linux ist das leider so eine Sache. Ich benutze zum Testen grundsätzlich immer nur das voreingestellte Standard-Thema einer Distribution. Leider enthalten viele auswählbare Themen noch Fehler und sind teilweise nicht ganz ausgereift. Es gibt im englischen Unterforum "Bugs - Linux" eine ganze Reihe gemeldeter Fehler, die auf fehlerbehaftete Themen zurückzuführen sind und die Fred deshalb nicht beheben kann/will, weil dies Aufgabe der Entwickler des jeweiligen Themas ist. Und in Verbindung mit GTK3, das von seiner Philosophie eigentlich nicht zu PureBasic passt (siehe Blog-Eintrag "Enter GTK3" von Fred), dürften diese Fehler noch gehäuft auftreten. Wenn einem aber ein bestimmtes Thema unheimlich gut gefällt, dann sollte man den Entwicklern dieses Themas helfen, indem man versucht, Fehler in diesem Thema zu finden und Verbesserungsvorschläge/Fehlerbehebungen an die Entwickler senden...

Re: Warum sieht ein Gui unter Linux nicht schön aus?(Anfänge

Verfasst: 01.01.2019 16:48
von mk-soft
@Shardik,

vielen Dank für den Code und den Ansatz dieses auch für die Gadget umzusetzen.

Ich habe dein Code mit "gtk_style_context_remove_provider" erweitert, damit man auch mehrmals die Hintergrundfarbe ändern kann.

Code: Alles auswählen

EnableExplicit

ImportC ""
  gtk_css_provider_load_from_data(*CSSProvider, CSSData.P-UTF8, Length.I,
    *Error.GError)
  gtk_css_provider_new()
  gtk_style_context_add_provider(*StyleContext, *StyleProvider, Priority.I)
  gtk_style_context_remove_provider(*StyleContext, *StyleProvider)
  gtk_widget_get_style_context(*Widget.GtkWidget)
EndImport

#GTK_STYLE_PROVIDER_PRIORITY_USER = 800

Procedure.I GetGTK3MinorVersion()
  Protected GTK3Version.S
  Protected GTK3MinorVersion.I
  Protected ProgramID.I

  ProgramID = RunProgram("pkg-config", "--modversion gtk+-3.0", "",
    #PB_Program_Open | #PB_Program_Read)

  If ProgramID
    GTK3Version = ReadProgramString(ProgramID)
    GTK3MinorVersion = Val(StringField(GTK3Version, 2, "."))
    CloseProgram(ProgramID)
  EndIf

  ProcedureReturn GTK3MinorVersion
EndProcedure

Procedure SetWindowBackColor(WindowID.I, Color.I)
  Static NewMap CSSProviderMap()
  Protected ContainerWidget.I
  Protected CSSProvider.I
  Protected CSSContext.I
  Protected CSSColor.S
  Protected CSSData.S
  Protected GTK3MinorVersion.I

  CSSColor = "#" + RSet(Hex(Red(Color)), 2, "0") +
    RSet(Hex(Green(Color)), 2, "0") + RSet(Hex(Blue(Color)), 2, "0")
  GTK3MinorVersion = GetGTK3MinorVersion()

  If GTK3MinorVersion > 15
    CSSData = "window.background {background-color: " + CSSColor + ";}"
    ContainerWidget = WindowID(WindowID)
  Else
    CSSData = "GtkLayout {background-color: " + CSSColor + ";}"
    ContainerWidget = g_list_nth_data_(gtk_container_get_children_(WindowID(WindowID)), 0)
    ContainerWidget = g_list_nth_data_(gtk_container_get_children_(ContainerWidget), 0)
  EndIf
  CSSProvider = gtk_css_provider_new()
  CSSContext = gtk_widget_get_style_context(ContainerWidget)
  If FindMapElement(CSSProviderMap(), Hex(WindowID))
    gtk_style_context_remove_provider(CSSContext, CSSProviderMap())
  EndIf
  CSSProviderMap(Hex(WindowID)) = CSSProvider 
  gtk_css_provider_load_from_data(CSSProvider, CSSData, -1, 0)
  gtk_style_context_add_provider(CSSContext,
    CSSProvider, #GTK_STYLE_PROVIDER_PRIORITY_USER)
  g_object_unref_(CSSProvider)
EndProcedure

OpenWindow(0, 100, 100, 350, 230, "Window with custom background color")
SetWindowBackColor(0, $EAD1B9)

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow

Re: Warum sieht ein Gui unter Linux nicht schön aus?(Anfänge

Verfasst: 02.01.2019 18:35
von Sven
aixwanderer hat geschrieben:warum sieht die GUI nicht schön wie unter Windows aus.
Das muss so! Die Linuxer wollen das so.

Ich ärger mich auch regelmäßig drüber, dass für Linux die Buttons mindestens doppelt so hoch sein müssen, und man doppelt soviel Breite für den gleichen Text einplanen muss, damit er nicht abgeschnitten wird. Und so Kram wie eingefärbte Gadgets fang ich gar nicht mehr an. Dann noch so Feinheiten im Design wie: Editierbare Comboboxen sind eckig, nicht editierbare haben runde Ecken - und eine andere Höhe...

Für Linux eine ansprechende Oberfläche erstellen ist sinnlos, mit dem nächsten OS-Update kann die schon wieder anders aussehen. Oder Du machst alles Owner-Draw.