在Kivy中,是否可以采用类似于以下示例的方法? 发布的代码显然不起作用,而且它只是一个例子:我需要根据某个属性绘制不同的布局。
你会如何建议解决这个问题?
{{1}}
答案 0 :(得分:1)
我会使用ScreenManager或Carousel,一个简单的例子可能是:
Carousel:
index: 1# or a "certain property" :)
scroll_timeout: 0.0 # disable the user ability to mess with the widgets layout
BoxLayout: #first option
Label:
Button:
BoxLayout: #2nd option
Button:
Label:
如果您将索引绑定到您选择的属性,它将自动切换布局:)...
基于 ScreenManager 的方法非常相似,主要更改只是绑定 current_screen 属性而不是 index
答案 1 :(得分:1)
KV lang只有有限的功能,所以如果你想要更多的控制,你应该把你的逻辑放在Python代码中。例如,您可以将布局移动到单独的小部件中,然后使用void ls(char** array)
{
pid_t pid = fork();
if (pid == 0)
{
execv("./ls",array);
}
else
{
waitpid(pid,0,0);
}
}
void cp(char** array)
{
pid_t pid = fork();
if (pid == 0)
{
execv("./cp",array);
}
else
{
waitpid(pid,0,0);
}
}
void groups(char** array)
{
pid_t pid = fork();
if (pid == 0)
{
execv("./groups",array);
}
else
{
waitpid(pid,0,0);
}
}
int input()
{
char buffer[128];
char * str;
char * str1;
char * str2;
char * str3;
char *name;
int i = 0;
int num;
int words = 1;
name = getlogin();
printf("%s --->", name);
int result = scanf("%[^\n]",buffer);
getchar();
char **array;
if (result > 0)
{
for (int i = 0; buffer[i]!='\0'; i++)
{
if (buffer[i] == ' ' || buffer[i] == '\n' || buffer[i] == '\t')
{
words++;
}
}
array = malloc(words * sizeof(char*));
array[0] = strtok(buffer, " ");
for(int w = 1; w < words; w++)
{
array[w] = strtok(NULL, " ");
}
if (words == 1)
{
array[1] = '\0';
}
}
str = strstr(array[0], "ls");
str1 = strstr(array[0], "cp");
str2 = strstr(array[0], "groups");
str3 = strstr(array[0], "exit");
if (str != NULL)
{
ls(array);
free(array);
}
else if (str1 != NULL)
{
cp(array);
free(array);
}
else if (str2 != NULL)
{
groups(array);
free(array);
}
else if (str3 != NULL)
{
num = 0;
free(array);
return num;
}
else
{
printf("Incorrect command\n");
}
num = 1;
return num;
和add_widget()
从Python代码中动态选择适当的小部件。
remove_widget()