Et sted skal man vel starte :)
Nå nu har jeg kastede mig ud i lidt vala alligevel, og vil lave et program som kan oversætte dansk til Røversprog (En sjov lille ting som var "in" i mine unge dage).
Har selv programeret GUI, ved hjælp af bl.a. Vala - Documentation og Vala tutorial og så i nok kan se er jeg ikke nået langt med at connecte de ting der er nødvendigt.
Men Koden kan compiles med
Kunne godt tænke mig lidt feedback og tips - Er jeg fuldstændig lost?
using Gtk;
public class Piratsprog : Window {
public Piratsprog ()
{
this.title = "Oversæt Dansk til Røver Sprog";
this.window_position = WindowPosition.CENTER;
this.destroy.connect (Gtk.main_quit);
this.border_width = 8;
set_default_size (700, 20);
var button = new Button.with_label ("Translate!");
var Input_textbox = new Gtk.Entry();
var Output_textbox = new Gtk.Entry();
var vbox = new Box (Orientation.VERTICAL, 4);
vbox.add (Input_textbox);
vbox.add (button);
vbox.add (Output_textbox);
add (vbox);
button.clicked.connect (() => {
Output_textbox.set_text("Så langt så godt!");
});
}
public static int main (string[] args)
{
Gtk.init (ref args);
var window = new Piratsprog ();
window.show_all ();
Gtk.main ();
return 0;
}
}
Har selv programeret GUI, ved hjælp af bl.a. Vala - Documentation og Vala tutorial og så i nok kan se er jeg ikke nået langt med at connecte de ting der er nødvendigt.
Men Koden kan compiles med
valac --pkg gtk+-3.0 pirat.vala
med det behøver jeg vel ikke fortælle :)Kunne godt tænke mig lidt feedback og tips - Er jeg fuldstændig lost?
Kommentarer18
Det ser udmærket ud :)
Hvis
Hvis du vil være lidt moderne kan du lavet det til en GtkApplication:
(jeg har ikke forsøgt at compile det)
using Gtk;
public class Piratsprog : Application {
public Piratsprog ()
{
Object (application_id: "dk.linuxin.piratsprog", flags: ApplicationFlags.FLAGS_NONE);
}
protected override void startup ()
{
base.startup ();
var window = new ApplicationWindow();
window.title = "Oversæt Dansk til Røver Sprog";
window.window_position = WindowPosition.CENTER;
window.border_width = 8;
window.set_default_size (700, 20);
add_window (window);
var button = new Button.with_label ("Translate!");
var Input_textbox = new Gtk.Entry();
var Output_textbox = new Gtk.Entry();
var vbox = new Box (Orientation.VERTICAL, 4);
vbox.add (Input_textbox);
vbox.add (button);
vbox.add (Output_textbox);
add (vbox);
button.clicked.connect (() => {
Output_textbox.set_text("Så langt så godt!");
});
}
public override void activate ()
{
window.present ();
}
public static int main (string[] args)
{
Gtk.init (ref args);
var app = new Piratsprog ();
return app.run ();
}
}
#2 Og hvad indebærer det?
Først og fremmest
Derudover overvåger den dine "toplevel windows". Når den sidste af dem bliver lukket vil programmet automatisk stoppe. Bemærk at der ikke længere er denne del:
this.destroy.connect (Gtk.main_quit);
Du kan også styre om programmet skal tillade mange instanser, eller om der kun må køre 1 ad gangen.
Når maskinen lukkes ned kan du bruge gtkapplication til automatisk at gemme eller forsøge at stoppe/udsætte nedlukning. Smart til arbejde der ikke er gemt eller f.eks. en cd-brænder der er i gang.
Der er mange små nice-to-have's. Generelt set er det den anbefalede måde at starte et program på i dag.
her kan du se hvordan du
using Gtk;
public class Piratsprog : Application {
private ApplicationWindow window;
//sæt actions til at pege på metode-kald i din app
private const GLib.ActionEntry[] action_entries =
{
{ "about-action", about_cb },
{ "quit-action", quit_cb }
};
public Piratsprog ()
{
Object (application_id: "dk.linuxin.piratsprog", flags: ApplicationFlags.FLAGS_NONE);
add_action_entries (action_entries, this);
}
protected override void startup ()
{
base.startup ();
window = new ApplicationWindow();
window.title = "Oversæt Dansk til Røver Sprog";
window.window_position = WindowPosition.CENTER;
window.border_width = 8;
window.set_default_size (700, 20);
add_window (window);
var button = new Button.with_label ("Translate!");
var Input_textbox = new Gtk.Entry();
var Output_textbox = new Gtk.Entry();
var vbox = new Box (Orientation.VERTICAL, 4);
vbox.add (Input_textbox);
vbox.add (button);
vbox.add (Output_textbox);
add (vbox);
button.clicked.connect (() => {
Output_textbox.set_text("Så langt så godt!");
});
//gør dine actions tilgængelige for ipc
var menu = new Menu ();
menu.append ("About", "app.about-action");
menu.append ("Quit", "app.quit-action");
set_app_menu (menu);
}
public override void activate ()
{
window.present ();
}
//en lille about
private void about_cb ()
{
Gtk.show_about_dialog (window,
"program-name", "Piratsprog",
"comments", "Grrrrr",
"authors", "boogie",
null);
}
//quit kan også ske fra app menuen. Den lukker bare dit vindue og app'en lukker selv derefter
private void quit_cb ()
{
window.destroy ();
}
public static int main (string[] args)
{
Gtk.init (ref args);
var app = new Piratsprog ();
return app.run ();
}
}
yuk. "//gør dine actions
(har ikke compilet forøvrigt)
Okay det vil jeg kigge på,
Et spørgsmål til, nu har jeg jo brugt timer på det og compilede et utal af gange med fejl og mangler, men alt det her public, private, public static - ved jeg egentligt ikke så meget om - Hvor kan jeg finde det? Så jeg kan lære det fra bunden. Vil jo gerne blive dygtig og være med på hvorfor det ene bliver valgt frem for det andet. Hjælp endelig en ny Programmør på rette vej, tak :)
#6
https://live.gnome.org/Vala/Manual/Classes#Class_scope
Hurtige Eksempler:
public -metoden kan kaldes fra hvilket som helst sted i din kode
private - kan kun kaldes af klassen selv
public static - samme som ovennævnte, men man behøver ikke et objekt af klassen
protected - kan kun kaldes af klassen selv og dens sub-klasser.
using Gtk;
public class
using Gtk;
public class Roeversprog : Application {
private ApplicationWindow window();
private const Gtk.ActionEntry[] action_entries =
{
{ "about-action", about_cb },
{ "quit-action", quit_cb }
};
public Roeversprog ()
{
Object (application_id: "dk.linuxin.Roeversprog", flags: ApplicationFlags.FLAGS_NONE);
add_action_entries (action_entries, this);
}
protected override void startup ()
{
base.startup ();
window = new ApplicationWindow();
window.title = "Oversæt Dansk til Røver Sprog";
window.window_position = WindowPosition.CENTER;
window.border_width = 8;
window.set_default_size (700, 20);
add_window (window);
var button = new Button.with_label ("Translate!");
var Input_textbox = new Gtk.Entry();
var Output_textbox = new Gtk.Entry();
var vbox = new Box (Orientation.VERTICAL, 4);
vbox.add (Input_textbox);
vbox.add (button);
vbox.add (Output_textbox);
add (vbox);
button.clicked.connect (() => {
Output_textbox.set_text("Så langt så godt!");
});
var menu = new Menu();
menu.append ("About", "app.about-action");
menu.append ("Quit", "app.quit-action");
set_app_menu (menu);
}
public override void activate ()
{
window.present ();
}
private void about_cb ()
{
Gtk.show_about_dialog (window,
"program-name", "Piratsprog",
"comments", "Grrrrr",
"authors", "boogie",
null);
}
public static int main (string[] args)
{
Gtk.init (ref args);
var app = new Roeversprog ();
return app.run();
}
}
med --pkg Gtk+-3.0
#5 jeg får: error: `Application' is an ambiguous reference between `GLib.Application' and `Gtk.Application' public class Roeversprog : Application {
Og nu er jeg lost :)
#8Jeg ved godt du ikke
Jeg ved godt du ikke spørger mig, men jeg svarer nu alligevel :)
Fejlen får du, da compileren ikke ved om det er GLib.Application eller Gtk.Application din klasse Roeversprog nedarver fra.
Der står i den tutorial jeg linker til nedenunder, at Glib er importeret som default. Prøv evt. at angive eksplicit at det er Gtk.Application der nedarves fra.
Du kan læse mere her: https://live.gnome.org/Vala/Tutorial#Namespaces
(OBS: Dette er ikke afprøvet)
Helistorm har helt ret. Der
Her er noget der virker:
using Gtk;
public class Roeversprog : Gtk.Application {
private ApplicationWindow window;
private const GLib.ActionEntry[] action_entries =
{
{ "about-action", about_cb },
{ "quit-action", quit_cb }
};
public Roeversprog ()
{
Object (application_id: "dk.linuxin.Roeversprog", flags: ApplicationFlags.FLAGS_NONE);
add_action_entries (action_entries, this);
}
protected override void startup ()
{
base.startup ();
window = new ApplicationWindow(this);
window.title = "Oversæt Dansk til Røver Sprog";
window.window_position = WindowPosition.CENTER;
window.border_width = 8;
window.set_default_size (700, 20);
add_window (window);
var button = new Button.with_label ("Translate!");
var Input_textbox = new Gtk.Entry();
var Output_textbox = new Gtk.Entry();
var vbox = new Box (Orientation.VERTICAL, 4);
vbox.add (Input_textbox);
vbox.add (button);
vbox.add (Output_textbox);
window.add (vbox);
button.clicked.connect (() => {
Output_textbox.set_text("Så langt så godt!");
});
var menu = new GLib.Menu();
menu.append ("About", "app.about-action");
menu.append ("Quit", "app.quit-action");
set_app_menu (menu);
window.show_all ();
}
public override void activate ()
{
window.present ();
}
private void about_cb ()
{
string[] authors = { "Boogie" };
Gtk.show_about_dialog (window,
"program-name", "Piratsprog",
"comments", "ARhhhhg",
"authors", authors,
null);
}
private void quit_cb ()
{
window.destroy ();
}
public static int main (string[] args)
{
Gtk.init (ref args);
var app = new Roeversprog ();
return app.run();
}
}
#9 Helt fint, suger bare til
Kommer nok mange spørgsmål hen ad vejen, håber i har tålmodighed :)
#10 Perfekt.
Egentligt var jeg inde og prøve selv om det var dét, manglede bare GLib menu.
Kan se du også lavede lidt om her:
private void about_cb ()
{
string[] authors = { "Boogie" };
Gtk.show_about_dialog (window,
"program-name", "Piratsprog",
"comments", "Oversæt Dansk til Rørver Sprog",
"authors", authors,
null);
}
kan se det lavede authors om til en string, korrekt? Men hvorfor?
string[] authors = {
Det er bare en liste (Et String Array) med navne på skaberne af programmet.
Lidt overflødigt, hvis det kun er dig.
Da jeg skrev det første
API'en forventer en string array:
http://developer.gnome.org/gtk3/unstable/GtkAboutDialog.html#GtkAboutDi…
button.clicked.connect (() => {
var result = Input_textbox.text;
Output_textbox.set_text(result);
});
Nu har jeg sat dette ind under, "protected override void startup ()" klassen. Er det rigtigt approach eller skulle man gøre det anderledes? tænker og sætte "button" funktionen i en ny class eller noget, Må også hellere have lidt tips hvordan man manipulere med result.
i = input(str())
x = (len(i))
print(i + ', ' + i + ', ' + 'bo-b' + i[1:x])
print('banana-fana fo-f' + i[1:x])
print('fee-fi-mo-m' + i[1:x])
print(i + '!')
Her er et eksempel jeg har lavet i Python. nogle tips
Boogie:
Du skriver i en
Du skriver i en anden tråd, at du gerne vil hjælpe lidt til på gnome. Hvad siger du til at vi sætter piratsprog lidt på pause og fortsætter med at lave en feature på gnome-games?
Jeg skal nok hjælpe dig i gang og rådgive hen ad vejen. Du er velkommen til at skrive en mail til mig på min gmail af samme navn.
#15 synes jeg er en rigtig
Phomes: Nu skal jeg lige
Jeg skal gerne være mentor.